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