f : File of String[80];
он не будет похож на текстовый файл из строк. В нем по-прежнему не будет символов конца строки, а будет (после записи) сплошная последовательность символов, кратная 81 (80 символов в строке и байт длины строки). Хуже того, если реальные значения строк короче 80 символов, то все равно в файле окажется по 81 символу на строку, и «излишки» будут забиты «мусором»,
Поэтому любые попытки трактовать типизированный файл как текст, особенно попытки вывести его на экран или принтер, вызовут ошибки и непредсказуемые последствия.
Для специальных целей (например, написания программ перекодировки текстов) можно трактовать текстовые файлы как File of Char. Это, разумеется, не оживит работу процедур ReadLn/WriteLn и функции EOLn, работающей с текстами, но при соблюдении неприкосновенности и неизменности кодов конца строки и конца файла (символ #26), даст возможность побуквенного чтения, изменения и последующей записи в другой File of Char исходного текста. Каркас такой программы показан на рис. 12.7.
| PROGRAM Decode_Text;
| VAR
| fIn, fOut : File of Char; {файлы для чтения и записи}
| Ch : Char; {обрабатываемый символ }
| FUNCTION DecodeChar( С : Char ) : Char;
| { Функция должна возвращать символ,
| получающийся перекодировкой из C. }
| BEGIN { . . . } END;
| BEGIN
| Assign( fIn, 'C:\DOC\DOCUM.A' ); Reset( fIn );
| Assign( fOut, 'C:\DOC\DOCUM.B' ); Rewrite( fOut );
| Ch := ' '; { очистка Ch }
| while Ch <> #26 do
{цикл до конца ТЕКСТОВОГО файла:}
| begin
| Read ( fIn, Ch ); { читается символ }
| Write( fOut, DecodeChar(Ch) ) { запись замены }
| end; {while} { конец цикла }
| Close( fIn ); Close( fOut ) { закрытие файлов }
| END.
Рис. 12.7
- 249 -
(Чтобы не закладывать имена текстовых файлов в текст самой программы, следовало бы использовать функцию ParamStr или организовать более или менее «дружелюбный» диалог с пользователем, что советуем сделать.)
Преимущества типизированных файлов очевидны: они максимально эффективным способом хранят числовую информацию, позволяют считывать и записывать сложные и громоздкие структуры буквально одной командой, например:
TYPE
dim100x20 = Array [1..100, 1..20] of Real;
VAR
XX, YY : dim100x20;
fIn, Fout : File of dim100x20;
BEGIN
... { открытие файлов fin и fOut... }
Read( fIn, XX ); { считывается сразу весь массив }
... { обрабатываются массивы }
Write( fOut, YY ); { записывается весь массив сразу }
... { среди прочего — закрытие файлов}
END.
В то же время эти файлы неоптимальны для хранения строк (лучше использовать Text-файлы) и имеют сложное внутреннее представление. Последнее означает, что если забыть, что именно содержится в подобном файле, то его просмотр вряд ли поможет.
Размер буфера для типизированных файлов устанавливается автоматически, исходя из размера компонентов. Пользователю не предоставляется возможность изменить корректным способом его размер.
12.8. Бестиповые файлы и операции ввода-вывода
Стандарт Турбо Паскаля вводит особый файловый тип, являющийся, по сути, обобщенным файловым типом. Мы будем называть его в дальнейшем бестиповым файлом, поскольку его обозначение состоит только из слова File без указания типа компонент.
Бестиповый файл — это очень мощное средство работы с файлами, так как он позволяет манипулировать с данными, не задумываясь об их типе. С его помощью можно записывать на диск произвольные участки рабочей памяти ПЭВМ и считывать их в память диска. Можно также преобразовывать считываемые из бестипового файла данные в любой формат посредством приведения типов. В этом разделе будут рассмотрены некоторые примеры использования бестиповых файлов.
- 250 -
Ввод-вывод в бестиповые файлы осуществляется специальными процедурами BlockRead и BlockWrite. Кроме того, расширяется синтаксис процедур Reset и Rewrite. В остальном принципы работы остаются такими же, как и с типизированными файлами. Перед использованием файловая переменная f (логический файл)
VAR
f : File;
должна быть связана с конкретным физическим файлом через вызов оператора Assign. Далее файл должен быть открыт для чтения или записи с помощью вызова процедуры Reset (f) или Rewrite (f) соответственно. После окончания работы файл должен быть закрыт процедурой Close (f).