- 248 -
VAR
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-файлы) и имеют сложное внутреннее представление. Последнее означает, что если забыть, что именно содержится в подобном файле, то его просмотр вряд ли поможет.