Работа с текстовыми файлами. Физические файлы и файловые переменные. Подпрограммы открытия и обработки файлов, страница 4

При выполнении вызова read(f, X) переменной X типа char присваивается доступный символ текста, каким бы он ни был, а доступным становится следующий за ним. Исключением является  случай, когда доступен конец файла – тогда значением X становится символ chr(26), и он же остается доступным. Итак, при чтении символов: пробелы, символы табуляции и конца строки обрабатываются так же, как и все другие символы.

Пример:

Рассмотрим выполнение такой программы:

program eofad;

const eo=chr(26);

var f : text; ch : char;

begin

assign(f, ‘eofad.dat’);

rewrite(f);

writeln(f, ‘abc’, eo, ‘qq’); {запись 6 символоввфай

close(f);

reset (f);

while not eof(f)   do begin

{в тексте есть доступный символ, и он не является chr(26)}

read(f, ch);           {доступный символ читается в переменную ch}

write(ch)

end;

close(f);

readln

end.

При ее выполнении на экране будет напечатано лишь abc. Дело в том, что после того, как прочитан символ с, доступным становится chr(26). Далее выполняется вызов eof (f), из него возвращается значение true, и выполнение цикла заканчивается.

Если переменная Xстрочного типа, то при выполнении вызова read(f, X) символы  до  ближайшего  слова  eol  читаются и  присваиваются элементам строки х; доступным становится eol т.е. chr (13) в системе Turbo Pascal . Если символов текста до слова eol больше, чем умещается в X, то X заполняется ими до конца и доступным становится первый символ за прочитанными в X.

Если перед чтением строки Xдоступен символ eol, то он остается доступным, а значением X становится пустая строка. Вот почему мы рекомендуем не применять процедуру read при чтении строк.

Особенно опасным является применение read при вводе строк в цикле. Если после ввода строки доступным символом станет eol, то при дальнейших попытках чтения строк они будут получать значение ‘‘ (пустая строка), eol будет оставаться доступным и выполнение программы может “зациклиться”. Например, при выполнении цикла вида:

while not  eof(f)  do begin

read   (f,   x);      {???}

обработка х

end

где х – переменная-строка, читаются лишь символы первой строки текста, после чего конец строки остается “доступным навсегда”. Цикл выполняется, компьютер “висит”, а пользователь программы начинает нервничать и ругаться.

Если при чтении строки доступен конец текста, он аналогично остается доступным, а переменной-строке присваивается значение ‘’ (пустая строка).

Чтение символов и строк с помощью процедуры readln аналогично чтению с помощью read, но после чтения символов остаток строки текста пропускается, т.е. доступным становится символ, следующий за ближайшим словом eol. Советуем задавать чтение строк с помощью процедуры readln.

Список имен переменных в вызове readln может быть пустым; в таком случае пропускается текущая строка текста.

6. Чтение текста со строками ограниченной длины

Во многих текстах длина строк неодинакова, но ограничена, как правило, числом, которое не превышает 255 – максимальную длину строк типа string. Использование переменных этого типа позволяет очень просто описывать чтение текстов.

Алгоритмы решения задач по обработке таких текстов часто имеют общий вид:

while not eof (f) do begin

readln (f, s) ;                {s имееттип string}

обработкастроки s;

end.     

Задание для самостоятельного выполнения:

Написать программу вывода содержимого текстового файла в шестнадцатиричном формате.

Экран должен быть разделён на две части: в левой – узкой, должен выводиться обычный текст, в правой – в шестнадцатиричном формате.

Обеспечить момент скроллинга, т. е. передвижение по тексту при нажатии клавиш: вверх, вниз, PageUp, PageDown – причём текст при нажатия на эти клавиши должен одновременно перелистываться в обоих окнах.

Примечание:

В данной программе нужно учесть, что не любой символ можно вывести на экран.