Object Pascal/Przetwarzanie plików

Z Wikibooks, biblioteki wolnych podręczników.

Typy plików[edytuj]

W Object Pascalu istnieją trzy typy plików: pliki elementowe, tekstowe i amorficzne, ale omówimy tylko dwa pierwsze. Różnią się one sposobem deklaracji oraz sposobem odczytywania i zapisywania danych. Ogólny schemat obsługi plików w Object Pascalu:

  1. Stworzenie i skojarzenie zmiennej plikowej z plikiem.
  2. Otwarcie pliku.
  3. Odczyt lub/i zapis danych z/do pliku.
  4. Zamknięcie pliku.

Do otworzenia pliku używamy procedur reset(zmiennePlikowa) lub rewrite(zmiennaPlikowa). Do zamknięcia: Close(zmiennaPlikowa) Procedura reset otwiera plik i ustawia wskaźnik plikowy na jego początku (Przygotowuje plik do odczytu). Procedura rewrite otwiera plik i usuwa całą jego zawartość następnie ustawia wskaźnik plikowy na początku pliku. (Procedura ta tworzy plik, kiedy nie ma go na dysku) Procedura Close zamyka plik.

Pliki elementowe[edytuj]

Pliki elementowe są to pliki, w których zapisuje się jeden typ danych(np. integer, byte itd.). Deklaruje się je tak:

var 
  nazwaZmiennej : file of typ;

Oto program pokazujący jak to działa:

program pliki1;

var 
  plik1 : file of integer;
  zmienna : integer;
  zmienna2 : integer;

begin
  zmienna := 14354;
  zmienna2 := 2516;
  Assign(plik1, 'C:\integer.int');   {Skojarzenie zmiennej plikowej z plikiem na dysku}
  Rewrite(plik1);                    {Otworzenie zmiennej plikowej i usunięcie z niej danych (lub stworzenie nowego pliku)}
  write(plik1, zmienna, zmienna2);   {Zapisanie zmiennej do pliku}
  Reset(plik1);                      {Powrót na początek pliku}
  read(plik1,zmienna2);              {Odczytanie zmiennej z pliku}
  writeln(zmienna2);                 {Napisze "14354"}
  Close(plik1);                      {Zamknięcie pliku}
  readln;
end.

Pliki tekstowe[edytuj]

Pliki tekstowe są to pliki, w których możemy zapisać tekst i traktować prawie tak jak standardowe wyjście. Deklaracja tych plików wygląda tak:

var 
  nazwaZmiennej : text;

To prosty przykład:

program plikit;

var
  Plik: Text;                          {zmienna plikowa tekstowa}

begin
  assign(Plik, 'nowy.txt');            {przypisanie pliku do zmiennej}
  rewrite(Plik);                       {usunięcie danych z pliku}
  writeln(Plik, 'fasola bywa wesoła'); {wpisanie danych do pliku}
  close(Plik);                         {zapisanie pliku}
end.

Plik nowy.txt w katalogu programu będzie teraz zawierał tekst "fasola bywa wesoła" bez względu na to, czy wcześniej istniał i czy coś zawierał.

W formacie tekstowym możemy zapisać dowolne dane, jednak kosztem tego, że operacje odczytu i zapisu będą bardziej skomplikowane - dlatego, że w plikach tekstowych musimy wszystko odczytywać po kolei. Oto program pokazujący jak to wszystko działa:

program plikit2;

var
  plik : text;
  dana1 : string;
  dana2 : integer;
  dana3 : byte;
  tablica : array [0..10] of string;
  i : integer;

begin
  dana1 := 'Hmm';
  dana2 := 12412;
  dana3 := 123;
  Assign(plik, 'C:\plik.txt');
  Rewrite(plik);
  writeln(plik, dana1, dana2);        {Zapisanie danych do pliku (Odbywa się to tak samo, jak wypisywanie danych do konsoli)}
  writeln(plik, dana3);
  Close(plik);

  Reset(plik);                        {Otwarcie pliku w trybie do odczytu}
  i := 0;
  while not EOF(plik) do
  begin
    readln(plik, tablica[i]);
    i := i + 1;
  end;
  Close(plik);

  for i := 0 to 10 do
  begin
    writeln(tablica[i]);
  end;
  readln;
end.

Jak widać program jest o wiele bardziej złożony. Oto co zostanie wypisane na ekran po uruchomienu programu:

 
Hmm12412
123









Do pisania do pliku wcale nie musisz otwierać pliku instrukcją Rewrite, która kasuje zawartość pliku! Instrukcja Append otwiera plik w trybie "do dopisu", w którym (jak sama nazwa mówi) dopisuje się dane do pliku. Należy pamiętać że procedurę Append możemy używać tylko i wyłącznie do obsługi plików tekstowych.

Warto zwrócić uwagę na funkcję EOF(plik) w powyższym programie. Informuje ona czy jesteśmy na końcu pliku (end-of-file). EOF bez argumentów sprawdza, czy wprowadzono znak końca pliku z klawiatury (crtl+D w Linuksie, ctrl+Z w DOSie).

program czytaj;

const
   n = 10;

var
  tablica : array [1..n] of integer;
  i, j : integer;

begin
  i := 1;
  {wczytuje dane aż użytkownik wprowadzi znak końca pliku lub skończy się miejsce w tablicy}
  while not EOF do
  begin
    readln(tablica[i]);
    i := i + 1;
    if i > n then
    begin
      writeln('Brak miejsca w tablicy.');
      break; {przerywa pętlę}
    end;
  end;
  
  {wypisuje dane}
  for j := 1 to i-1 do
  begin
    writeln(tablica[j]);
  end;
  readln;
end.

Warto wiedzieć, że instrukcja assign(plik, '') z nazwą pliku będącą łańcuchem pustym wiąże plik ze standardowym wejściem (klawiatura i ekran).