Operacje IO


Obsługa plików o elementach niezdefiniowanych

Pliki niezdefiniowane (tzn. o elementach niezdefiniowanego typu) stanowią niskopoziomowy kanał dostępu bezpośredniego do zbiorów dyskowych, niezależny od typu informacji zapisanej w pliku.

Deklaracja zmiennej plikowej niezdefiniowanego typu:

var F: File;
Otwieranie

Do otwierania pliku niezdefiniowanego służą procedury standardowe Reset i Rewrite, które w odróżnieniu od plików tekstowych i zdefiniowanych, poza zmienną plikową, mogą mieć dodatkowy drugi parametr. Specyfikuje on rozmiar rekordu zapisu/odczytu stosowanego w jednorazowej operacji odczytu lub zapisu. W przypadku pominięcia drugiego parametru, przyjmowana jest wartość domyślna: 128.

 Rewrite(F); 
 //jest równoważne
 Rewrite(F,128);
 ...
 Reset(F); 
 //jest równoważne
 Reset(F,128);

Jedynie jednobajtowy rozmiar rekordu gwarantuje bezbłędność operacji I/O niezależnie od rodzaju i rozmiaru pliku.

 Rewrite(F,1);
 ...
 Reset(F,1);
Zapis i odczyt

Do zapisu i odczytu w plikach niezdefiniowanych służy specjalna para procedur standardowych: BlockRead i BlockWrite. Używa się tych procedur wyłącznie w odniesieniu do plików niezdefiniowanych.


procedure BlockWrite(var F: File; var Buf;
                 Count: Integer [; var NumRec:Integer]);
procedure BlockRead(var F: File; var Buf; 
                 Count: Integer [; var NumRec: Integer]);

gdzie:    Buf - zmienna stanowiąca bufor odczytu/zapisu
Count - liczba zlecanych odczytów/zapisów
NumeRec - liczba wykonanych przez procedurę odczytów/zapisów.

Przykład:

var
  FromF, ToF: File;
  NumRead, NumWritten: Integer;
  Buf: array[1..2048] of Char;
begin
  if OpenDialog1.Execute then //Wyświetla OpenDialog
  begin
    AssignFile(FromF, OpenDialog1.FileName);
    Reset(FromF, 1);	//wielkość rekordu = 1B
    if SaveDialog1.Execute then  //Wyświetla SaveDialog
    begin
      AssignFile(ToF, SaveDialog1.FileName);	
      Rewrite(ToF, 1);	//wielkość rekordu = 1B
      repeat
        BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
        BlockWrite(ToF, Buf, NumRead, NumWritten);
      until (NumRead = 0) or (NumWritten <> NumRead);
      CloseFile(FromF);
      CloseFile(ToF);
    end;
  end;
end;

Funkcja SizeOf - zwraca rozmiar parametru w bajtach, parametrem może być też identyfikator typu.