Pliki tekstowe
Typ plikowy
Programy, które pisaliśmy do tej pory komunikowały się z otoczeniem poprzez klawiaturę, z której pobierały dane od użytkownika, oraz monitor, na którym wyświetlały wyniki. Urządzenia te mają wspólną cechę –
nietrwałość informacji. Program nie może ponownie pobrać danych z monitora i ich przetworzyć. Do przechowywania danych i wyników służy pamięć zewnętrzna. Program może zapisać dane na dysk, a inny program może je odczytać. Do ustalenia pozostaje forma w jakiej dane mają być zapisane. Jedną z nich jest zewnętrzny plik tekstowy. Do pliku tekstowego można dokładać znaki, wiersze, łańcuchy znaków. Z tego pliku można odczytać znaki w takiej kolejności w jakiej zostały zapisane. Z każdym plikiem związany jest wskaźnik pliku, który wskazuje znak od którego rozpocznie się odczytywanie.
Szczególnym przypadkiem pliku tekstowego jest konsola, która służy do komunikacji z użytkownikiem poprzez monitor i klawiaturę. Procedury write i writeln dopisują tekst do pliku konsoli i wypisują na monitorze.
Procedury read i readln wczytują tekst z klawiatury do konsoli i odczytują z konsoli.
Obsługa plików wymaga:
• opisu zmiennej plikowej w części deklaracyjnej programu,
• skojarzenia zmiennej plikowej z plikiem fizycznym,
• otwarcia pliku (do zapisu lub do odczytu),
• wykonania niezbędnych operacji (czytanie, zapis i inne),
• zamknięcia pliku.
Zmienna plikowa
Pośrednikiem pomiędzy programem a plikiem na dysku jest zmienna plikowa. Dla pliku tekstowego zmienna ta jest typu text (typ standardowy). Zmienna ta musi być zadeklarowana w części opisowej programu np.
Var nazwa_zm_plikowej : text;
Deklaracja nie mówi z którym plikiem na dysku związana jest zmienna plikowa. Zmienna ta jest uniwersalnym pośrednikiem pomiędzy programem a jakimś plikiem tekstowym na dysku.
Kojarzenie zmiennej plikowej z plikiem zewnętrznym
Kojarzenie zmiennej plikowej z plikiem zewnętrznym odbywa się poprzez procedurę assign ASSIGN ( nazwa_zm_plikowej, nazwa_pliku zewnętrznego)
Nazwa pliku zewnętrznego może być stałą tekstową ( podana w apostrofach) lub zmienną. Jeżeli plik znajduje się w innym katalogu niż bieżący to jego nazwa powinna być poprzedzona ścieżką dostępu. To jest jedyne miejsce w programie, gdzie występuje nazwa pliku zewnętrznego. Od tego momentu program będzie się odwoływał do pliku poprzez zmienną plikową.
Otwieranie pliku
Do otwierania pliku służą procedury:
REWRITE( nazwa_zm_plikowej)
Procedura zakłada na dysku nowy plik skojarzony ze zmienną plikową do zapisu. Jeżeli plik o takiej nazwie już istnieje to zostanie skasowany a na jego miejsce powstanie plik pusty. Po otwarciu za pomocą tej procedury plik jest zawsze pusty.
APPEND ( nazwa_zm_plikowej)
Procedura otwiera istniejący już plik skojarzony ze zmienna plikową do dopisywania na końcu pliku, za wszystkim co w tym pliku było zapisane. Jeżeli plik na dysku nie istnieje, to wystąpi błąd.
RESET ( nazwa zm_plikowej)
Procedura otwiera i istniejący już plik do odczytu. Tekst czytany jest w takiej kolejności w jakiej był
zapisywany.
1
Pliki tekstowe
Zapisywanie
Zapisywanie do pliku odbywa się przy pomocy procedur :
WRITE ( nazwa_zm_plikowej,wyrażenie tekstowe)
Procedura zapisuje tekst z wyrażenia tekstowego na końcu ostatniego wiersza, nie powoduje rozpoczęcia nowego wiersza.
WRITELN ( nazwa_zm_plikowej,wyrażenie tekstowe)
Procedura zapisuje tekst z wyrażenia tekstowego na końcu ostatniego wiersza i rozpoczyna nowy wiersz.
W pliku tekstowym wszystko, nawet elementy liczbowe, zapisywane jest jako tekst. Przy zapisie procedurą writeln automatycznie dopisywany jest znacznik końca wiersza. Na końcu pliku dopisywany jest znacznik końca pliku.
Odczytywanie z pliku
Do odczytywania z pliku służą procedury :
READ ( nazwa_zm_plikowej, zmienna)
Procedura read zachowuje się różnie w zależności od tego jakiego typu jest zmienna, do której wczytuje wartość. Dla zmiennej typu char po wczytaniu wskaźnik pliku przesuwa się do następnego znaku, a wczytany znak jest przypisany zmiennej. Nie ma podziału na wiersze, znak końca wiersza zostanie wczytany jak każdy inny znak. Dla zmiennej typu string read przeczyta wszystkie znaki od aktualnego położenia wskaźnika do ostatniego znaku w wierszu. Wskaźnik pliku zatrzyma się na pierwszym napotkanym znaku końca wiersza.
Kolejna procedura read ze zmienną typu string zwróci łańcuch pusty, bo wskaźnik pliku jest już na końcu wiersza, a procedura read czyta do końca wiersza. Dla zmiennej typu liczbowego procedura read przestawia wskaźnik pliku do pierwszej cyfry (pomija odstępy i znaki końca wiersza) i kończy wczytywanie po napotkaniu odstępu lub końca wiersza. Jeżeli wczytany ciąg znaków nie da się zamienić na liczbę wystąpi błąd.
READLN ( nazwa_zm_plikowej, zmienna)
Procedura czyta wszystko do znaku końca wiersza i przenosi wskaźnik pliku do nowego wiersza. Można ta procedurą czytać szereg łańcuchów.
Procedury i funkcje wykorzystywane do obsługi plików
EOF( nazwa_ zm_plikowej)
Funkcja logiczna, która przyjmuje wartość TRUE, gdy wskaźnik pliku pokazuje na znak końca pliku EOLN ( nazwa_zm_plikowej)
Funkcja logiczna, która przyjmuje wartość TRUE, gdy wskaźnik pliku pokazuje na koniec wiersza.
Zamykanie pliku
CLOSE ( nazwa_zmiennej_plikowej)
Procedura zamyka plik skojarzony ze zmienną plikową. Każdy plik otwarty w programie powinien być zamknięty.
Ćwiczenie 1
• Napisz program, który założy na dysku w bieżącym katalogu plik tekstowy o nazwie kotek.txt i zapisze do niego tekst :
Wszedl kotek na plotek
i mruga.
program p1;
var f : text;
begin
2
Pliki tekstowe
assign(f, ’kotek.txt’);
rewrite(f);
writeln(f, ’Wszedl kotek na plotek’);
write(f,’ i ‘);
writeln(f, ’mruga’);
close(f);
end.
• Sprawdź czy plik powstał na dysku i jaka jest jego zawartość.
• Zmień tekst zapisywany do pliku, uruchom program jeszcze raz, sprawdź jaka jest teraz zawartość pliku
• Zmodyfikuj program tak, aby plik kotek.txt powstał na dysku, w katalogu C:\TP (lub C:\BP).
Uwagi:
Procedura rewrite ustawia znacznik pliku na początku i od początku pliku zapisuje tekst.
Procedura ta zastosowana do pliku, który już istnieje, nowy tekst zapisuje od początku pliku zacierając dotychczasową zawartość pliku.
Ćwiczenie 2
• Napisz program, który na końcu pliku kotek.txt dopisze dowolny tekst wprowadzony z klawiatury i wyświetli na ekranie cały plik kotek.txt dwoma sposobami: znak po znaku i całymi wierszami.
program p2;
var
f : text;
Tekst : string;
C
:char;
begin
{ dopisywanie do pliku}
assign (f,’kotek.txt’);
append(f);
writeln(‘podaj tekst’);
readln(tekst);
writeln(f,tekst);
close (f);{ czytanie pliku całymi wierszami}
reset(f);
while not eof(f) do
begin
readln(f , tekst);
writeln(tekst);
end;
close(f);
{ czytanie pliku znak po znaku}
reset(f);
while not eof(f) do
begin
while
not eoln(f) do
begin
read (f,c);
write(c);
end;
readln(f); {1}
writeln;
end;
close(f);
end.
Uwagi:
Instrukcja oznaczona {1} ma przeczytać znacznik końca linii zapisany przez instrukcję writeln i przywrócić funkcji eoln wartość False
• Zastosuj powyższy program do wyświetlenia pliku piesek.txt. Jak zakończył się program?.
3
Pliki tekstowe
Ćwiczenie 3
• Napisz funkcję logiczną, która przyjmie wartość True, gdy uda się skojarzyć zmienną plikową z plikiem fizycznym i otworzyć go do odczytu (reset). W przeciwnym razie funkcja przyjmuje wartość False.
function jest_plik_1(s:string):boolean;
var f:text;
begin
assign(f,s);
{$I-} reset (f); {$I+}
if IOResult = 0 then
begin
close(f);
jest_plik_1 := true;
end
else jest_plik_1 := false;
end; {funkcji jest_plik_1}
Uwagi :
Jeżeli pliku nie ma to próba otwarcia go do odczytu procedurą reset powoduje błąd. Trzeba więc przechwycić kontrolę nad tym błędem i sprawdzić czy wystąpił. Dyrektywa kompilatora $I- powoduje wyłączenie , a dyrektywa $I+ włączenie sprawdzania poprawności wykonania instrukcji wejścia-wyjścia.
Jeżeli zawarta pomiędzy nimi procedura reset spowoduje błąd (bo plik nie będzie istniał), program nie zakończy swojego działania komunikatem o błędzie, a kod błędu określi wartość funkcji IOResult.
IOResult jest funkcją standardową modułu System, która podaje, w postaci liczby całkowitej typu Word, status ostatnio wykonanej operacji wejścia wyjścia, pod warunkiem, że nie jest aktywna systemowa kontrola warunków wejścia–wyjścia (może być wyłączona dyrektywą kompilatora $I-). Jeżeli podczas wykonywania operacji wejścia-wyjścia nie wystąpił żaden błąd to wartością funkcji jest 0, w przeciwnym wypadku kod błędu.
• Sprawdź działanie tej funkcji w programie.
Ćwiczenie 4
Napisz procedurę, która wyświetla na ekranie zawartość dowolnego pliku tekstowego wierszami w następujący sposób:
− Przed każdym wierszem wyświetli numer kolejny wiersz.
− Przerywa wyświetlanie po 5 wierszach i kontynuuje po naciśnięciu dowolnego klawisza.
− Na końcu wyświetla napis „koniec pliku”.
4