Работа с типизированными файлами

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

type

NewFileType = file of DataType;

В следующем коде продемонстрировано создание нового файлового типа, который можно использовать для считывания и записи записей в типизированном файле:

type

TPerson = record

FirstName: string[20];

LastName: string[30];

Age: Integer;

end;

TPersonFile = file of TPerson;

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

Существует несколько различий между текстовыми и типизированными файлами:

§ При сбросе типизированного файла в нем можно выполнять считывание и запись (при сбросе текстового файла в нем можно выполнять только считывание).

§ При выполнении считывания или записи из типизированного файла необходимо использовать процедуры Read и Write, а не ReadLn и WriteLn.

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

type

TPerson = record

FirstName: string[20];

LastName: string[30];

Age: Integer;

end;

TPersonFile = file of TPerson;

procedure ReadRecord(const AFileName: string; var Rec: TPerson);

var

F: TPersonFile;

begin

AssignFile(F, AFileName);

{$I-}

Reset(F);

{$I+}

if IOResult = 0 then

begin

Read(F, Rec);

CloseFile(F);

end; // if IOResult

end;

procedure WriteRecord(const AFileName: string; var Rec: TPerson);

var

F: TPersonFile;

begin

AssignFile(F, AFileName);

Rewrite(F);

Write(F, Rec);

CloseFile(F);

end;

procedure DipslayRecord(var Rec: TPerson);

begin

Writeln('First name: ', Rec.Firstname);

Writeln('Last name: ', Rec.LastName);

Writeln('Age: ', Rec.Age);

Writeln;

end;

var

TestRec: TPerson;

ReadRec: TPerson;

begin

TestRec.FirstName:= 'Stiven';

TestRec.LastName:= 'King';

TestRec.Age:= 58;

WriteRecord('info.dat', TestRec);

ReadRecord('info.dat', ReadRec);

DipslayRecord(ReadRec);

Readln;

end.

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

Для определения количества записей в файле можно использовать функцию FileSize. Для перехода к определенной записи в файле можно использовать процедуру Seek. Эта процедура принимает два параметра: переменную файла и целочисленное значение, указывающее номер записи (начиная с 0), к которой необходимо выполнить переход.

var

F: TPersonFile;

RecCount: Integer;

begin

RecCount:= FileSize(F);

if RecCount = 0 then

WriteLn('Файл пуст')

else

Seek(F, FileSize(F));

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: