Песни о Паскале | страница 91
Впрочем, механизм последовательного доступа не запрещает программисту в любой момент вернуться к началу файла и повторить чтение – достаточно вызвать процедуру Reset.
Теперь испытаем то, что узнали о чтении текстовых файлов. Напишем небольшую программу, выводящую на экран свой собственный исходный текст, вот её первый вариант.
>{ P_25_1 – распечатка текста программы }
>var F: text; { файловая переменная }
> S: string; { строка }
>begin
> Assign(F, 'P_25_1.pas'); { назначаем собственное имя }
> Reset(F); { открываем файл для чтения }
> repeat
> if Eof(F) then Break; { прекратить, если конец файла }
> Readln(F, S); { прочитать строку из файла }
> Writeln(S); { вывести строку на экран }
> until false;
> Close(F); { закрываем файл }
> Readln; { ждать Enter }
>end.
Выделенный курсивом оператор проверяет достижение конца файла, и делает это перед чтением строки. Если же проверять в конце цикла
> ...
>until Eof(F);
это неизбежно приведет к ошибке после чтения последней строки файла.
Достижение конца файла надо проверять своевременно! Для этого в Паскале есть подходящий оператор цикла, – пора познакомиться с ним. До сих пор мы обходились двумя циклическими операторами, а именно:
• циклом с проверкой условия в конце REPEAT-UNTIL;
• циклом со счетчиком FOR-TO-DO.
Новый для нас оператор цикла строится из двух ключевых слов, вот его формат:
WHILE <условие> DO <оператор>
По-русски это читается так: "ПОКА условие истинно, ВЫПОЛНЯТЬ оператор такой-то". После ключевого слова DO допускается лишь один оператор, но на практике требуется больше. Потому здесь часто вставляют операторный блок BEGIN-END, в итоге получается такая конструкция.
>WHILE <условие> DO BEGIN
> <последовательность операторов>
>END
Обратите внимание, что условия продолжения циклов в операторах WHILE-DO и REPEAT-UNTIL взаимно противоположны! Первый из них выполняется, пока условие истинно, а второй – пока оно ложно.
С новым оператором «самораспечатка» станет такой.
>{ P_25_2 – распечатка текста программы }
>var F: text; { файловая переменная }
> S: string; { строковая переменная }
>begin
> Assign(F, 'P_25_2.pas'); { назначаем собственное имя }
> Reset(F); { открываем файл для чтения }
> while not Eof(F) do begin { пока не конец файла }
> Readln(F, S); { прочитать строку из файла }