Бестиповые файлы и операции ввода-вывода
Типизированные файлы и операции ввода-вывода
Типизированный файл — это файл с наборами данных одной и той же структуры, т.е. описанных структурой
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 Кб.