File5. Дано имя файла целых чисел. Найти количество элементов, содержащихся в данном файле. Если файла с таким именем не существует, то вывести $$-1$$.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
program File5; var S: String; F: File of Integer; i,Num: integer; begin Write('S: '); Readln(S); Num:=0; Assign(F,S); {$I-} Reset(F); {$I+} if IOResult<>0 then Writeln(-1) else begin while not eof(F) do begin Read(F,i); writeln(i); inc(Num); end; end; Writeln(Num); Close(F); end. |
Решение от Кирилла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
uses PT4; var s: string; n,i: integer; f: file of integer; begin Task('File5'); read(s); n := 0; if FileExists(s) then begin Assign(f,s); Reset(f); while not eof(f) do begin read(f,i); inc(n); end; write(n); end else begin Assign(f,s); // Задачник требует ассоциировать переменную с файлом, создать Rewrite(f); // файл и открыть его для ПЕРЕЗАПИСИ (возможно, баг), даже если write(-1); // такой файл отсутствует end; Close(f); end. |
Другие задачи из раздела File можно посмотреть здесь.
Подскажи, пожалуйста, что есть: {$I-} и {$I+} в коде и для чего это. В туториале для PascalABC.NET такого не нашёл.
И aeyrwbb IOResult в задачнике тоже не нашёл…
Когда компьютеры были большие, а программы маленькие. И не было функции FileExists(). Люди пользовались для этого следующими костылями:
Штуки типо {$I-} это флаги для компилятора. По умолчанию если программа видит ошибку связанную с файлом, например он не может открыться, то программа выдаёт ошибку и закрывается.
Для решения данной задачи мне надо было изменить поведения программы на данное событие и я указал флаг копилятору:
{$I-}
При этом флаге если происходит ошибка во время работы с файлом, программа не закрывается, а продолжает работать дальше.
Этот флаг:
{$I+}
возвращает реакцию на ошибку по умолчанию.
А вот сюда попадают коды ошибок IOResult.
Соответственно если IOResult не равен нулю значит там код ошибки.
Но повторюсь этот код лучше использовать в старых версиях компилятара, где нет функции проверки существования файла. Ваш вариант, для вашего копилятора подходит больше.
Автоматическая проверка задачника pt4taskbook (Абрамяна) требует ассоциировать переменную с файлом, даже если файл отсутствует + открыть его для перезаписи (не для чтения). Т.е. У меня получился такой код: