Типизированные файлы.

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

Все элементы типизированного файла одного типа, а зна­чит, и одного размера. Именно благодаря этому возможен произвольный доступ к элементам типизированного файла, т.к. по номеру элемента однозначно определяется его местоположение на магнитном диске. Нумеруются элемен­ты файла целыми числами, начиная с нуля.

Типизированная файловая переменная описывается пред­ложением

var имя: file of базовый тип

Связь файловой переменной с набором данных на диске выполняется, как и для.текстовых файлов, оператором Assign.

В отличие от текстовых, типизированные файлы допускают чередование операций записи и чтения независимо от того, каким оператором, Reset или Rewrite, был открыт файл. Оператором Reset открываются уже существующие файлы, а оператором Rewrite — новые. Закрывается файл оператором Close. Внешне все четыре оператора не отличаются от таких же операторов для текстовых файлов.

Чтение из типизированного файла выполняется оператором

Read (файл, vl [,v2,...,vN]),

запись — оператором

Write (файл, v1 [,v2,...,vN]),

где v1 ,v2.. vN — переменные базового типа.

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

существенно ускоряет эти операции. За это мы лишаемся важного преимущества текстовых файлов — возможности хранить в файле разнотипные данные.

Произвольный доступ к элементам файла выполняется оператором

Seek (файл, номер элемента: longint)

Этот оператор устанавливает указатель файла на элемент, номер которого является вторым параметром. Именно этот элемент будет считан или записан при очередном вводе или выводе.

Текущее положение указателя файла возвращается функцией

FilePos (файл) : longint,

а общее количество записей — функцией

FileSfee (файл) : longirrt

Как и для текстовых файлов, ситуация «конец файла» диагностируется функцией EOF (файл).

Поскольку типизированные файлы не нуждаются в разделителях элементов, функция EOF и дополнительные операторы ReadLn и WriteLn для них не имеют смысла.

ПРИМЕР. Работа с типизированным файлом.

var

f: file of real;

R: real;

i: integer;

begin

{создать новый файл по имени REAL-FILE.DAT}

assign (f, 'REALFILE.DAT');

rewrite (f);

{сохранить вещественные числа в типизированном файле}

for i := 1 to 5 do

begin

readln (R);

write (f,R);

end;

{записать последнее число на место первого}

seek (f, fileSize (f) - 1);

read(f.R);

seek (f, 0);

write (f, R);

{дописать в файл число 5.5}

seek (f, filesize (f));

R := 5.5;

write (f, R);

{вывести содержимое файла на экран}

reset (f);

{без закрытия не будут видны изменения}

while not eof (f) do

begin

read (f,R);

writeln (R);

end {while};

close (f); {закрыть файл}

end,

 

Теперь рассмотрим непосредственную организацию чтения и записи.

Решим следующую задачу: "Написать программу, которая вводит с клавиатуры список фамилий учащихся, а затем распечатывает его, кроме тех учащихся, у которых фамилия начинается с буквы 'Ш'".

Так как заранее количество данных не известно, то для их хранения используем файл. Тип элементов - строковый.

Program L;

Var

I,N : Integer;

F : File Of String;

S : String;

Begin

Assign(F,'Spis.lst'); {Связываем переменную F с файлом Spis.lst}

Writeln('Введите количество учащихся');

Readln(N); {Вводим количество учащихся}

Rewrite(F); {Создаем файл для записи в него данных}

For I:=1 To N Do {Для всех учащихся}

Begin

Writeln('Введите фамилию');

Readln(S);

Write(F,S)

End;

Close(F);

Reset(F);

Writeln('Список учащихся:');

While Not(Eof(F)) Do

Begin

Read(F,S);

If S[1]<>'Ш' ThenWriteln(S)

End;

Close(F)

End.