Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 160

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