Operacje IO


Obsługa plików o elementach zdefiniowanych

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.

Otwieranie

Pliki o elementach zdefiniowanych można otwierać procedurami Rewrite i Reset w zależności od sytuacji:

Zapis i odczyt

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;
Wybrane procedury standardowe związane z obsługą plików

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;
Pzykład fragmentu implementacji prostej bazy danych
{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;