Бестиповые файлы и операции ввода-вывода

Типизированные файлы и операции ввода-вывода

Типизированный файл — это файл с наборами данных од­ной и той же структуры, т.е. описанных структурой

File Of <Тип_компонент>,

где <Тип_компонент> — любой тип (предопределенный или за­данный программистом). Не допускается лишь объявлять файлы файлов и файлы объектов.

Чаще всего это файлы, состоящие из записей. Они применяются для создания различных баз данных. Стандартное задание в программе такой файловой переменной осуще­ствляется следующим образом:

type

FileRec = record

end; var

F : file of FileRec;

При работе с файлами следует выделить два этапа:

1) создание файла;

2) его использование.

Эти два этапа могут быть реализованы как в разных про­граммах, так и в одной (возможно оформленных в виде разных процедур).

Пример . Создать файл f целых чисел из диапазона M..N. Получить вещественный файл g, удваивая каждую компоненту файла f

Реализацию первого этапа оформим в виде отдельной программы.

Program Examp_24; {Создание файла}

Var M, N, i: Integer; f: File Of Integer;

Begin

Assign(f, 'INT.DAT'); { Связываем файловую переменнуюf с файлом на диске с именем INT.DAT}

ReWrite(f); { Открываем f для записи}

Write('M=');

ReadLn(M);

Write('N=');

ReadLn(N);

For i: =M To N Do { Наполняем его данными }

Write(f, i);

Close(f); {Закрываем /}

End.

Второй этап предполагает использование уже существующего файла на диске с именем 'INT.DAT', при этом количество его компонент неизвестно.

Файловый тип

Program Examp_25;{Использование файла/}

Var к: Integer; x: Real; f: File Of Integer; g: File Of Real;

Begin

Assign(f, 'INT.DAT');

ReSet(f); { Открываем уже существующий файл f, но уже для чтения}

Assign(g, 'RE.DAT'); { Связываем файловую переменную g с файлом на диске с именем RE.DAT}

ReWrite(g); {Открываем g для записи}

While Not EOF(f) Do

Begin {Пока не конец файла,}

Read(f, k); {считываем данные из f}

х:=к/2.;

Write(g, x); {Записываем результат в g}

End;

Close(g); {Закрываем g}

Close(f); {Закрываем f}

{Контрольный вывод результата } ReSet(g); { Открываем g для чтения }

While Not EOF(g) Do Begin

Read(g, x); {Считываем данные из файла g u} WriteLnfx); {выводим их на экран } End;

Close(g); {Закрываем g}

End.

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

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

Ввод-вывод в бестиповые файлы осуществляется специаль­ными процедурами BlockRead и BlockWrite. Кроме того, расширя­ется синтаксис процедур ReSet в ReWrite. В остальном принципы работы остаются такими же, как в с типизированными файлами.

Открывая бестиповый файл для работы, мы неявно устанав­ливаем размер буфера передачи данных, равный 128 байт. Однако можно явным способом указать иной размер буфера, исходя из ресурсов памяти и удобства работы с данными. Для задания бу­фера надо открывать файл расширенной записью процедур:

Reset(Varf: File; BufSize: Word)

ReWrite(Varf: File; BufSize: Word).

Параметр BufSize задает число байтов, считываемых из фай­ла за одно обращение к нему или записываемых в него. Чем больше значение BufSize, тем быстрее происходит обмен данными между носителем файла (как правило, диском) и оперативной памятью.

Минимальный блок, который может быть записан или про­читан из файла, — это 1 байт. Чтобы задать его, надо установить именно такую величину буфера при открытии файла. Максималь­ный размер блока не может превышать 64 Кб.