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:
- 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
[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).