var
s:string;
...
min:=-1;
while not eof(f) do
begin
readln(s);
if min=-1 then min:=lengs(s);
if lengs(s)<min then min:=lengs(s);
end;
writeln('min =',min);
....
var
s:string;
...
min:=-1;
while not eof(f) do
begin
readln(s);
if min=-1 then min:=lengs(s);
if lengs(s)<min then min:=lengs(s);
end;
writeln('min =',min);
....
Проблема твоей программы - в том, что если будет пустая строка, то все летит, ты читаешь не те символы #13#10, которые надо читать, а пропуская #13, читаешь #10 и затем - первый символ следующей строки. И еще одно совсем непонятное место - это пляски вокруг I и N перед выводом результата. Не проще выводить N, чем делать то, что ты делаешь? В общем как-то вот так:
USES CRT;
VAR
F:TEXT;
I:WORD;
C:CHAR;
N:WORD;
BEGIN
CLRSCR;
ASSIGN(F,'F1.TXT');
RESET(F);
I:=0;
N:=60000;
WHILE NOT EOF(F) DO
BEGIN
IF EOLN(F) THEN
BEGIN
IF (i > 0) and (I<N) THEN N:=I;
I:=0;
READ(F,C);
READ(F,C);
END;
if not eoln(f) then begin { <--- Это НЕ ветка Else предыдущего условия !!! }
READ(F,C);
I:=I+1;
end;
END;
WRITE('MIN = ');
WRITELN(N);
END.