PODST AWY PROGRAM OWANIA
Pliki tekstowe
1
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.
PODST AWY PROGRAM OWANIA
Pliki tekstowe
2
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
PODST AWY PROGRAM OWANIA
Pliki tekstowe
3
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?.
PODST AWY PROGRAM OWANIA
Pliki tekstowe
4
Ć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”.