Plik o elementach zdefiniowanych przechowuje informację w postaci binarnej, odpowiadającej dokładnie reprezentacji binarniej kolejnych zapisywanych w pliku elementów. Dlatego w celu uniknięcia przekłamań, do zapisu i do odczytu znależy stosować w roli buforów zmienne, zadeklarowane w identyczny sposób jak deklaracja typu elementu pliku.
Pliki o elementach zdefiniowanych można otwierać procedurami Rewrite i Reset w zależności od sytuacji:
Dostęp do plików o elementach zdefiniowanych jest co prawda sekwencyjny, ale dzięki procedurze standardowej Seek można swobodnie określić pozycję "kursora" pliku.
Zapis i odczyt realizują procedury standardowe:
Pierwszym parametrem jest zawsze zmienna plikowa. Kolejne parametry wymieniane po przecinku, specyfikują listę elementów zapisywanych/odczytywanych do/z pliku.
Przykład:
var f:File of Double;
x,y,z:Double;
begin
AssignFile(f, 'c:\plik.dat');
Rewrite(f); //otwarcie nowego pliku
x:=random;
Write(f,x); //zapis pierwszego elementu
y:=random;
z:=random;
Write(f,y,z); //zapis drugiego i trzeciego elementu
CloseFile(f); //zamknięcie pliku
Reset(f); //otwarcie pliku
Read(f,x); //odczyt pierwszego elementu
Read(f,y,z); //odczyt drugiego i trzeciego elementu
CloseFile(f); //zamknięcie pliku
end;
Przykład:
var f:File of Double;
A,B:array[1..1000] of Double;
n,i: integer;
x:Double;
begin
AssignFile(f, 'c:\plik.dat');
Reset(f);
{Przykład odczytu do tablicy wszystkich elementów pliku}
{pierwszy sposób}
n:=FileSize(f); //odczyt rozmiaru pliku
for i:=1 to n do
Read(f,A[i]);
Seek(f,0); //ustawienie kursora na początku pliku
{drugi sposób}
while not Eof(f) do
begin
Read(f,x);
i:=FilePos(f); //odczyt pozycji "kursora"
B[i]:=x;
end;
{Przykład usunięcia drugiej połowy pliku}
n:=FileSize(f) div 2;
Seek(f,n);
Truncate(f);
CloseFile(f);
end;
{Deklaracje potrzebnych typów}
type TMyRec=record
imie,nazw: string[20];
wiek:integer;
end;
TBaseFile=File of TMyRec;
var Base:TBasefile;
{procedura otwarcia/utworzenia pliku bazy}
procedure OpenMyBase(FileName:String);
begin
AssignFile(Base,FileName);
if FileExists(FileName) then //jeśli plik istnieje...
Reset(Base) //jest otwierany...
else //a jeśli nie...
Rewrite(Base); //jest tworzony
end;
{Odczyt numeru rekordu}
function RecNo:Integer;
begin
result:=FilePos(Base);
end;
{dopisanie nowego rekordu na końcu pliku}
procedure Append(Rec:TMyRec);
begin
Seek(Base,FileSize(Base));
Write(Base,Rec);
end;
{modyfikacja Nr-tego rekordu}
procedure Update(Nr:integer;Rec:TMyRec);
begin
Seek(Base,Nr);
Write(Base,Rec);
end;
{odczyt Nr-tego rekordu}
function GetRec(Nr:Integer):TMyRec;
begin
Seek(Base,Nr);
Read(Base,Result);
end;
{usunięcie ostatniego rekordu}
procedure DeleteLast;
begin
Seek(Base,FileSize(Base)-1);
Truncate(Base);
end;