Песни о Паскале | страница 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);       { прочитать строку из файла }