Typy plików w Pascalu

Patkoss

Język Pascal ze względu na swoją niezwykle elegancką składnie (podobnie jak Basic) do dziś jest używany w ośrodkach akademickich jako podstawowe narzędzie nauki metodyki programowania. Dalsze rozwijanie tego języka przez Borland'a w pakiecie Delphi (oraz Kylix) sprawia, że język ten znajduje także szerokie zastosowanie jako profesjonalne narzędzie zawodowych programistów. Pascal w stosunku do innych języków wyróżnia się niezwykle intuicyjną i elegancką obsługą plików.
W języku Pascal możemy wyróżnić trzy rodzaje plików. Każdy rodzaj pliku wymaga osobnej deklaracji zmiennej plikowej - reprezentującej zbiór dyskowy w naszym programie. I tak:

type typea=...
var filea: file of typea;

Jest to deklaracja pliku typowego o jasno zdefiniowanej strukturze. Każdy element tego pliku jest instacją struktury typu zdefiniowanego. Może to być typ prosty lub złożony, np.:

var file1: file of byte; {plik o elementach typu byte, po prostu liczby całkowite o rozm. 1b}
var file2: file of record {plik o elementach typu rekordowego}
                    id: byte;
                    nm: string[20];
                 end;

Mamy także pliki tekstowe:

var file_txt: text;

Pliki te to po prostu pliki textowe ASCII. Możemy też myśleć o takich plikach jak o zbiorach znaków ASCII. Ostatni typ plików w Pascalu to pliki beztypowe (amorficzne). Są to pliki o niejawnej strukturze. Może to być każdy plik znajdujący się na dysku. Traktowany jest jako ciąg bajtów o nieuporządkowanej strukturze:

var file_byt: file;

Każdy, z tych trzech typów plików jest reprezentowany w programie przez odbowiednią zmienną plikową. Do każdego z tych typów mamy podobne procedury i funkcje służące do zapisu/odczytu informacji i obsługi. Najważniejszą parą procedur z punktu widzenia plików typowych jest read/write (odczyt/zapis), plików textowych read/write oraz readln/writeln, plików amorficznych blockread/blockwrite. Oczywiście przed użyciem plik (jakiegokolwiek typu) należy otworzyć (ewentualnie stworzyć) oraz po użyciu zamknąć. Służą do tego procedury reset/rewrite oraz close. Aby było możliwe otwarcie pliku, należy zmienna plikową skojarzyć ze zbiorem na dysku (czyli fizycznym plikiem). Służy temu procedura assign. A oto przykładowy kod:

{typ rekordowy dla pliku typowego}
type rec=record
           id: byte;
           nm: string[20];
         end;
{deklaracje zmiennych plikowych}
var ftyp: file of rec;
    ftxt: text;
    f   : file;
    dat : rec;
begin
{kojarzenie zmiennych ze zbiorami na dysku}  
  assign (ftyp, 'f_typ.dat');
  assign (ftxt, 'f_txt.txt');
  assign (f, 'file.swp');
{tworzenie fizycznych plików, reset()- służy do odtwarcie gdy pliki już istnieją}
  rewrite (ftyp);
  rewrite (ftxt);
  rewrite (f,1); 
{przy plikach amorficznych powinno się podawać wielkość
rekordu, jeśli by nie było tej jedynki to odczytywalibyśmy po
n*128 bajtów za każdym razem, co właściwie na pewno
spowoduje przepełnienie bufora; nam chodzi o n*1, stąd
ta jedynka - przyp ŁF}
  dat.id:=173;
  dat.nm:='Yding Skovhoj';
{zapisywanie informacji do...}
{pliku typowego}
  write (ftyp, dat); {użyj read aby odczytać dane}
{pliku textowego}
  writeln (ftxt, 'Yding Skovhoj i Danmark, hojhed: 173'); {readln do odczytu}
{pliku beztypowego}
  blockwrite (f, dat, 1); {blockread do odczytu}
{zamknięcie nieużywanych plików}
  close (ftyp); close (ftxt); close (f);
end.

Należy pamiętać, że w przypadku plików tekstowych writeln (w odróżnieniu od write) zapisuje znak przejścia do nowej lini na końcu wiersza. Należy także pamiętać, że w zależności od systemów należy różnie definiować ścieżki. Inaczej ścieżka wygląda w Windows, inaczej w Linux (Pascal w odróżnieniu od Javy nie jest w pełni przenośny - ale na pewno szybszy). W Object Pascalu plik możemy traktować również jako strumień, stosując podejście obiektowe.

2 komentarzy

1."Moim skromnym zdaniem Basic nie ma ładnej składni." ?? TO JEST PASCAL!
2.Mało! Mógłbyś się bardziej rozpisać np. o BlockRead() i BlockWrite().

  1. Moim skromnym zdaniem Basic nie ma ładnej składni. Brak procedur/funkcji. Ograniczenia w iteracji (ale to tak na marginesie)
  2. Mały błąd: zamiast "file1: byte" powinno być file1: file of byte;
  3. Może odrobinkę więcej formatowania?

W ogóle to artykuł przyzwoity