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;