Typy plików
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:
Stworzenie i skojarzenie zmiennej plikowej z plikiem.
Otwarcie pliku.
Odczyt lub/i zapis danych z/do pliku.
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
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
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 assert(plik, '') z nazwą pliku będącą łańcuchem pustym wiąże plik ze standardowym wejściem (klawiatura i ekran)