Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pesni_o_Paskale_2013-11-15.pdf
Скачиваний:
50
Добавлен:
13.04.2015
Размер:
5 Мб
Скачать
☆

Глава 25

Текстовые файлы

if Eof(F)

then { достигнут конец файла }

else { можно продолжать чтение }

Как видите, функцией EOF нельзя определить позицию чтения (то есть, номер читаемой строки); она сообщает лишь о том, достигнут конец файла или нет.

Что делать с прочитанной книгой? — закрыть и вернуть на полку. Так же поступают и с файлом — закрывают его. Эту операцию выполняют процедурой

Close — «закрыть».

Close(F);

Закрытие файла освобождает память, выделенную для него операционной системой, и снимает блокировку, давая возможность другим программам делать с файлом всё, что угодно. Закрытие освобождает и саму файловую переменную, — теперь ею можно воспользоваться для доступа к другому файлу.

На рис. 55 показаны этапы чтения данных из файла.

Назначить имя

 

Открыть для

 

Цикл чтения

 

 

(Assign)

 

чтения (Reset)

 

строк

 

Закрыть (Close)

 

 

 

 

(Readln)

 

 

 

 

 

 

 

 

 

Рис. 55 – Четыре этапа чтения из файла

Последовательный доступ к файлу

Как видите, читать текстовый файл можно только последовательно, строку за строкой — от начала к концу файла, — нельзя читать строки в ином порядке. Поэтому текстовые файлы относят к файлам с последовательным доступом. В отличие от них, бинарные файлы (например, файлы баз данных) допускают

произвольный доступ.

Впрочем, механизм последовательного доступа не запрещает программисту в любой момент вернуться к началу файла и повторить чтение — достаточно вызвать процедуру Reset.

Самореклама

Теперь испытаем то, что узнали о чтении текстовых файлов. Напишем небольшую программу, выводящую на экран свой собственный исходный текст, вот её первый вариант.

167

 

 

Глава 25

 

 

 

Текстовые файлы

 

 

 

 

 

 

{ 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, в итоге получается такая конструкция.

168

Глава 25

Текстовые файлы

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);

{ прочитать строку из файла }

Writeln(S);

 

{ вывести строку на экран }

end;

 

 

Close(F);

{ закрываем файл }

Readln;

{ ждем нажатия Enter }

end.

 

 

В условии цикла WHILE видим отрицание NOT, значит, цикл будет выполняться, пока НЕ обнаружен конец файла. Проверьте работу этой программы. В следующей главе мы рассмотрим запись данных в текстовый файл и завершим наш шифровальный проект. А сейчас, как обычно, подведем итоги.

Итоги

∙Текстовые файлы содержат строки видимых символов, отделенные друг от друга невидимыми на экране управляющими кодами CR (возврат каретки) и LF (перевод строки).

∙К текстовым файлам обращаются через файловые переменные типа TEXT.

∙Перед чтением файла нужны два шага: 1) связывание файловой переменной с именем файла процедурой Assign, и 2) открытие файла для чтения

процедурой Reset.

∙Для чтения отдельных строк вызывают процедуру Readln, при этом первым параметром процедуры указывают файловую переменную.

169

Глава 25

Текстовые файлы

∙После открытия файла его чтение начинается с первой строки; каждый вызов процедуры Readln смещает позицию чтения в начало следующей строки.

∙Чтение файла возможно, пока не будет прочитана последняя строка. Попытка чтения за концом файла вызовет аварию программы.

∙Чтобы узнать о достижении конца файла, вызывают функцию Eof, которая возвращает TRUE, если достигнут конец файла.

∙Признак окончания файла исследуют в начале цикла, и для этого лучше подходит оператор цикла WHILE-DO.

∙По окончании работы с файлом его закрывают процедурой Close.

Аслабо?

А) Можно ли связать текстовую переменную F с файлом оператором присваивания?

F := ’c:\autoexec.bat’;

Б) Напишите программу для вывода на экран файла, имя которого задается с клавиатуры.

В) Напишите три функции для подсчета:

∙строк в файле;

∙видимых символов в файле;

∙всех символов файла (фактический объём файла).

Функции принимают один параметр — ссылку на файловую переменную. Напишите программу, определяющую упомянутые характеристики файла.

Г) Объявите две файловые переменные, свяжите их с одним и тем же файлом, а затем откройте через обе переменные. Вызовет ли это ошибку? Объясните результат, исходя из здравого смысла.

Д) Усовершенствуйте программу «вопрос-ответ» (глава 16) с тем, чтобы ответы хранились не в программе, а в отдельном текстовом файле. Тогда пользователи программы сами смогут сочинять ответы.

Е) Напишите процедуру для вывода на экран N-й строки файла, где N — параметр процедуры. Воспользовавшись этой процедурой, напишите программу для распечатки строк файла в обратном порядке. Подсказка: предварительно посчитайте количество строк в файле.

170