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

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

<p>12.8. Бестиповые файлы и операции ввода-вывода</p>

Стандарт Турбо Паскаля вводит особый файловый тип, являющийся, по сути, обобщенным файловым типом. Мы будем называть его в дальнейшем бестиповым файлом, поскольку его обозначение состоит только из слова File без указания типа компонент.

Бестиповый файл — это очень мощное средство работы с файлами, так как он позволяет манипулировать с данными, не задумываясь об их типе. С его помощью можно записывать на диск произвольные участки рабочей памяти ПЭВМ и считывать их в память диска. Можно также преобразовывать считываемые из бестипового файла данные в любой формат посредством приведения типов. В этом разделе будут рассмотрены некоторые примеры использования бестиповых файлов.

- 250 -

Ввод-вывод в бестиповые файлы осуществляется специальными процедурами BlockRead и BlockWrite. Кроме того, расширяется синтаксис процедур Reset и Rewrite. В остальном принципы работы остаются такими же, как и с типизированными файлами. Перед использованием файловая переменная f (логический файл)

VAR

f : File;

должна быть связана с конкретным физическим файлом через вызов оператора Assign. Далее файл должен быть открыт для чтения или записи с помощью вызова процедуры Reset (f) или Rewrite (f) соответственно. После окончания работы файл должен быть закрыт процедурой Close (f).

Перейти на страницу:

Поиск

Похожие книги