Object Pascal/Przetwarzanie plików: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
m Poprawiki błedów
BartekChom (dyskusja | edycje)
styl, prosty przykład
Linia 1:
== Typy plików ==
 
W Object Pascalu istnieją trzy typy plików. Mianowicie: pliki elementowe, tekstowe i amorficzne, ale omówimy tylko dwa pierwsze. Różnią się one sposobem deklaracji ioraz sposobem odczytywania i zapisywania danych. Ogólny schemat obsługi plików w Object Pascalu:
'''1)# Stworzenie i skojarzenie zmiennej plikowej z plikiem. '''
'''2)# OtworzenieOtwarcie pliku. '''
'''3)# Odczyt lub/i zapis danych z/do pliku. '''
'''4)# Zamknięcie pliku. '''
 
Do otworzenia pliku używamy procedur <code>reset(zmiennePlikowa)</code> lub <code>rewrite(zmiennaPlikowa)</code>. Do zamknięcia: <code>Close(zmiennaPlikowa)</code>
Procedura <code>reset</code> otwiera plik i ustawia wskaźnik plikowy na jego początku (Przygotowuje plik do odczytu).
Procedura <code>rewrite</code> 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 <code>Close</code> 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:
 
Pliki elementowe są to pliki w których zapisuje się jeden typ danych(np. integer, byte itd.). Deklaruje się je tak:
<source lang="pascal">
var
nazwaZmiennej : file of typ;
</source>
 
Oto program pokazujący jak to działa:
 
<source lang="pascal">
program Pliki1pliki1;
 
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 Assign(plik1, 'C:\integer.int');//Otworzenie {Skojarzenie zmiennej plikowej i usunięcie z niejplikiem danychna (lub stworzenie nowego pliku)dysku}
Rewrite(plik1); {Otworzenie zmiennej plikowej i usunięcie z niej danych (lub stworzenie nowego pliku)}
write(plik1,zmienna,zmienna2);//Zapisanie zmiennej do pliku
read write(plik1, zmienna, zmienna2);//Odczytanie {Zapisanie zmiennej zdo pliku }
Close Reset(plik1);//Zamknięcie {Powrót na początek pliku}
read(plik1,zmienna2); {Odczytanie zmiennej z pliku}
writeln(zmienna2); {Napisze "14354"}
Close(plik1); {Zamknięcie pliku}
readln;
end.
</source>
 
== Pliki tekstowe ==
 
Pliki tekstowe są to pliki, w których możemy zapisać dowolne dane. Jednak kosztem tego że operacje odczytutekst i zapisu będą bardziej skomplikowane. Dlatego że w plikach tekstowychtraktować musimyprawie wszystkotak odczytywaćjak postandardowe koleiwyjście. deklaracjaDeklaracja tych plików wygląda tak:
 
<source lang="pascal">
var
nazwaZmiennej : text;
</source>
 
To prosty przykład:
Oto program pokazujący jak to wszystko działa.
 
<source lang="pascal">
program pliki2plikit;
 
var
Plik: Text; {zmienna plikowa tekstowa}
plik : text;
 
dana1 : string;
dana2 : integer;
dana3 : byte;
tablica : array[0..10] of string
i : integer;
begin
assign(Plik, 'nowy.txt'); {przypisanie pliku do zmiennej}
dana1 := 'Hmm';
rewrite(Plik); {usunięcie danych z pliku}
dana2 := '12412';
writeln(Plik, 'fasola bywa wesoła'); {wpisanie danych do pliku}
dana3 := '123';
close(Plik); {zapisanie pliku}
Assign(plik,'C:\plik.txt');
end.
Rewrite(plik);
</source>
writeln(plik,dana1,dana2);//Zapisanie danych do pliku (Odbywa się to trak samo jak wypisywanie danych do konsoli)
 
writeln(plik,dana3);
Plik <tt>nowy.txt</tt> 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ł.
Close(plik);
 
Reset(plik); //Otworzenie pliku w trybie do odczytu
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:
i := 0;
 
while not EOF(plik)do
<source lang="pascal">
program plikit2;
 
var
plik : text;
dana1 : string;
dana2 : integer;
dana3 : byte;
tablica : array [0..10] of string;
i : integer;
 
begin
dana1 := 'Hmm';
readln(plik,tablica[i]);
i := idana2 +:= 112412;
dana3 := 123;
end;
Close Assign(plik, 'C:\plik.txt');
Rewrite(plik);
for i := 0 to 10 do
writeln(plik, dana1, dana2); {Zapisanie danych do pliku (Odbywa się to tak samo, jak wypisywanie danych do konsoli)}
begin
writeln(tablica[i]plik, dana3);
Close(plik);
end;
 
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.
</source>
 
Jak widać program jest o wiele bardziej złożony.Oto co zostanie wypisane na ekran po uruchomienu programu:
Jak widać program jest o wiele bardziej złożony. Oto co zostanie wypisane na ekran po uruchomienu programu:
<source lang="dos">
 
(...)
<pre>
Hmm12412
123
 
</source>
 
 
 
 
 
 
 
 
</pre>
 
Do pisania do pliku wcale nie musisz otwierać pliku instrukcją <code>Rewrite</code>, która kasuje zawartość pliku! Instrukcja <code>Append</code> 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ę <code>Append</code> możemy używać tylko i wyłącznie do obsługi plików tekstowych.