Типизированный ( или компонентный) файл - это файл с объявленным типом его компонент. Компонентные файлы состоят из машинных представлений значений переменных они хранят данные в том же виде, что и память ЭВМ.
Описание величин файлового типа имеет вид:
type M= File Of T;
где М - имя файлового типа, Т - тип компоненты. Например:
type FIO= String[20]; SPISOK=File of FIO; var STUD, PREP: SPISOK;Здесь STUD, PREP - имена файлов, компонентами которых являются строки.
Описание файлов можно задавать в разделе описания переменных:
var fsimv: File of Char; fr: File of Real;
Компонентами файла могут быть все скалярные типы, а из структурированных - массивы, множества, записи. Практически во всех конкретных реализациях языка ПАСКАЛЬ конструкция "файл файлов" недопустима.
Все операции над компонентными файлами производятся с помощью стандартных процедур: Reset, Rewrite, Read, Write, Close.
Для ввода - вывода используются процедуры:
Read(f,X); Write(f,X);
где f - имя логического файла, Х - либо переменная, либо массив, либо строка, либо множество, либо запись с таким же описанием, какое имеет компонента файла.
Выполнение процедуры Read(f,X) состоит в чтении с внешнего устройства одной компоненты файла и запись ее в X. Повторное применение процедуры Read(f,X) обеспечит чтение следующей компоненты файла и за пись ее в X.
Выполнение процедуры Write(f,X) состоит в записи X на внешнее устройство как одной компоненты. Повторное применение этой процедуры обеспечит запись X как следующей компоненты файла.
Для работы с компонентными файлами введена расширенная форма операторов ввода и вывода:
Read(f,X1,X2,...XK) Write(f,X1,X2,...XK) Здесь f - компонентный файл, а переменные Х1, Х2,...ХК должны иметь тот-же тип, что и объявленный тип компонент файла f.
Нетипизированные (или бестиповые) файлы позволяют записывать на диск произвольные участки памяти ЭВМ и считывать их с диска в память. Операции обмена с бестиповыми файлами осуществляется с помощью процедур BloсkRead и BlockWrite. Кроме того, вводится расширенная форма процедур Reset и Rewrite. В остальном принципы работы остаются такими же, как и с компонентными файлами.
При открытии файла длина буфера устанавливается по умолчанию в 128 байт. PASCAL позволяет изменить размер буфера ввода - вывода, для чего следует открывать файл расширенной записью процедур:
Reset(var f: File; BufSize: Word) илиRewrite(var f: File; BufSize: Word) Параметр BufSize задает число байтов, считываемых из файла или записываемых в него за одно обращение.
Минимальное значение BufSize - 1 байт, максимальное - 64 К байт.
Чтение данных из нетипизированного файла осуществляется процедурой:
BlockRead( var f: File; var X; Count: Word; var QuantBlock: Word );
Эта процедура осуществляет за одно обращение чтение в переменную X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера. Значение Count не может быть меньше 1. За одно обращение нельзя прочесть больше, чем 64 К байтов.
Необязательный параметр QuantBlock возвращает число блоков (буферов), прочитанных текущей операцией BlockRead. В случае успешного за вершения операции чтения QuantBlock = Count, в случае аварийной ситуации параметр QuantBlock будет содержать число удачно прочитанных блоков.
Отсюда следует, что с помощью параметра QuantBlock можно контролировать правильность выполнения операции чтения.
Запись данных в нетипизированный файл выполняется процедурой:
BlockWrite( var f: File; var X; Count: Word; var QuantBlock: Word );
которая осуществляет за одно обращение запись из переменной X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера.
Необязательный параметр QuantBlock возвращает число блоков (буферов), записанных успешно текущей операцией BlockWrite.
Пример (запись данных о людях в файл различными способами и алгоритм считывания данных из файла):
type MyRec = record Name : string; Height : integer; Weight : real; end; var Mas : array[1..100] of MyRec; f1 : text; f2 : file; f3 : file of MyRec; i,n : integer; begin write('Введите количество людей: '); readln(n); for i := 1 to n dobegin write('Введите ФИО ',i,' человека: '); readln(Mas[i].Name); write('Введите рост ',i,' человека: '); readln(Mas[i].Height); write('Введите вес ',i,' человека: '); readln(Mas[i].Weight); end; assign(f1,'data,txt'); rewrite(f1); for i := 1 to n do begin writeln(f1, Mas[i].Name); writeln(f1, Mas[i].Height); writeln(f1, Mas[i].Weight); end; close(f1); assign(f2,'data.dat'); rewrite(f2,1); for i := 1 to n do begin blockwrite(f2, Mas[i].Name, SizeOf(Mas[i].Name)); blockwrite(f2, Mas[i].Height, SizeOf(Mas[i].Height)); blockwrite(f2, Mas[i].Weight, SizeOf(Mas[i].Weight)); end; close(f2); assign(f3,'data.rec'); rewrite(f3); for i := 1 to n do write(f3, Mas[i]); close(f3); n := 0; reset(f3); while not Eof(f3) do begin inc(n); read(f3, Mas[n]); end; close(f3); end.