Object Pascal/Przetwarzanie plikó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).