Podstawy Programowania
Wyk ad dziesi ty:
ł
ą
Pliki
1. Pliki – podstawowe wiadomo ci
ś
Je li dane, które przetwarza lub produkuje program komputerowy maj by
ś
ą
ć
dost pne po zako czeniu jego pracy, to musz one zosta przechowane
ę
ń
ą
ć
w pami ci masowej komputera. Pami
tego typu jest urz dzeniem
ę
ęć
ą
pozwalaj cym zachowa zapisane w niej informacje w sposób trwa y. Takimi
ą
ć
ł
urz dzeniami s np.: dyski twarde, p yty CD, DVD i pami ci typu Flash. Ka de
ą
ą
ł
ę
ż
z tych urz dze przechowuje dane w inny sposób. Aby ujednolici sposób
ą
ń
ć
korzystania ze zgromadzonych na nich informacji wprowadzono specjalną
struktur danych nazywan plikiem. Pliki gwarantuj ten sam sposób
ę
ą
ą
korzystania z informacji niezale nie od tego, czy znajduj si one na dysku
ż
ą
ę
twardym, w pami ci operacyjnej, czy innym no niku. W przypadku wi kszo ci
ę
ś
ę
ś
wspó czesnych systemów komputerowych urz dzenia zewn trzne, takie jak
ł
ą
ę
klawiatura, ekran, dysk twardy, nap d CD, drukarki s „widziane” przez
ę
ą
programy komputerowe w a nie jako pliki. J zyk Pascal pozwala korzysta
ł ś
ę
ć
z trzech rodzajów plików: plików tekstowych, plików binarnych zdefiniowanych
1
i plików binarnych niezdefiniowanych (amorficznych). Pliki, niezale nie do
ż
którego rodzaju nale
, sk adaj si zawsze z pewnych elementów.
żą
ł
ą
ę
W przypadku plików tekstowych tymi elementami s wiersze, czyli ci gi znaków
ą
ą
zako czone znakami ko ca wiersza (w przypadku Turbo Pascala s to znaki
ń
ń
ą
#13#10). Wynika st d, e wiersze te mog mie ró ny rozmiar. Elementami
ą
ż
ą
ć
ż
plików binarnych zdefiniowanych s warto ci okre lonego przez nas typu. Mog
ą
ś
ś
ą
to by warto ci typu
ć
ś
byte, integer, real
, a nawet typu rekordowego. W plikach
amorficznych (binarnych niezdefiniowanych) warto ci, które s przechowywane
ś
ą
nie maj okre lonego typu. Ca y plik jest podzielony na porcje o ustalonej
ą
ś
ł
wielko ci, zwane blokami. Dla wszystkich typów plików mo emy stosowa
ś
ż
ć
dost p sekwencyjny, tzn. taki, w którym aby przeczyta lub zapisa element
ę
ć
ć
znajduj cy si w dowolnym miejscu pliku musimy przeczyta wszystkie
ą
ę
ć
elementy znajduj ce si przed nim. W przypadku plików binarnych mo emy
ą
ę
ż
mie równie swobodny dost p do elementów plików
ć
ż
ę
2
. Pliki binarne mo emy
ż
zatem potraktowa jako tablice, których rozmiar jest zmienny.
ć
2. Typy plików
W Turbo Pascalu jedynym typem plików, który powinni my zdefiniowa jest typ
ś
ć
pliku binarnego zdefiniowanego. Typ pliku binarnego zdefiniowanego okre lamy
ś
w sekcji type programu lub podprogramu wed ug wzorca:
ł
nazwa_typu_pliku = file of nazwa_typu_elementu_pliku;
1 Nazywanych krótko plikami binarnymi.
2 Tzn. mo emy wskaza dowolny element, który chcemy przeczyta / zmodyfikowa , bez
ż
ć
ć
ć
konieczno ci przegl dania elementów je poprzedzaj cych.
ś
ą
ą
2
Przyk adowo, plik binarny, którego elementy by yby typu
ł
ł
integer
mia by na
ł
-
st puj c definicj typu:
ę
ą ą
ę
Pliki amorficzne, jak równie tekstowe maj ju zdefiniowane typy, które s
ż
ą
ż
ą
cz
ci j zyka i nie musimy im nadawa nowej nazwy (cho istnieje taka mo li
ęś ą ę
ć
ć
ż -
wo
). Typem pliku binarnego niezdefiniowanego jest po prostu
ść
file
, a typem
pliku tekstowego jest text.
3. Zmienne plikowe
Podobnie jak zmienne innych typów zmienne plikowe mo emy deklarowa
ż
ć
w sekcji var programu lub podprogramu. W przypadku plików binarnych
zdefiniowanych nale y wcze niej zdefiniowa typ takiej zmiennej wed ug za
ż
ś
ć
ł
-
mieszczonego wy ej wzorca, gdy zmiennych plikowych tego rodzaju o ano
ż
ż
-
nimowych typach nie b dziemy mogli przekaza przez parametr. Nie wymagaj
ę
ć
ą
tego zmienne plikowe zwi zane z plikami tekstowymi lub amorficznymi. Nie
ą
mo emy deklarowa zmiennych plikowych zainicjalizowanych. Jedynym spo
ż
ć
-
sobem, w jaki mo emy przekaza zmienn plikow do procedury lub funkcji za
ż
ć
ą
ą
pomoc parametru jest przekazanie przez zmienn (adres).
ą
ą
4. Operacje na plikach
Zanim b dziemy mogli zapisa lub odczyta informacje z pliku musimy wy
ę
ć
ć
-
kona dodatkowe czynno ci. Schemat korzystania z pliku mo e by przedsta
ć
ś
ż
ć
-
wiony nast puj co:
ę
ą
1. skojarzenie zmiennej z plikiem,
2. otwarcie pliku,
3. przetwarzanie informacji zawartych w pliku,
4. zamkni cie pliku.
ę
Nale y zaznaczy , e przy wykonywaniu prawie ka dej z tych operacji mog
ż
ć ż
ż
ą
pojawi si wyj tki
ć
ę
ą
3
, które nale y obs u y . Powy sze operacje s realizowane
ż
ł ż ć
ż
ą
za pomoc ró nych funkcji i procedur. Nazwy tych podprogramów mog si
ą
ż
ą
ę
3 Inaczej nazywane b dami, cho nie jest to nazwa w pe ni adekwatna.
łę
ć
ł
3
type
plik = file of integer;
ró ni w zale no ci od typu pliku, na którym zostan u yte. Zosta y one
ż ć
ż
ś
ą
ż
ł
zebrane w tabelk :
ę
Nazwa operacji
Typ pliku
Skojarzenie
Otwarcie
Odczyt
Zapis
Zamkni cie
ę
Plik tekstowy
assign
rewrite
reset
append
read
readln
write
writeln
close
Plik binarny
assign
rewrite
reset
read
write
close
Plik amorficzny
assign
rewrite
reset
blockread
blockwrite
close
Procedura assign dzia a w ten sam sposób dla wszystkich typów plików. Wi
e
ł
ąż
ona zmienn plikow z nazw pliku. Pierwszym parametrem jej wywo ania jest
ą
ą
ą
ł
nazwa zmiennej plikowej, a drugim ci g znaków b d cy nazw pliku. W Turbo
ą
ę ą
ą
Pascalu
4
nazwa pliku sk ada si maksymalnie z jedenastu liter lub cyfr.
ł
ę
Pierwszych osiem liter jest nazw w a ciw , a trzy ostatnie stanowi tak zwane
ą
ł ś
ą
ą
rozszerzenie, które okre la zawarto
pliku. Obie te cz
ci nazwy pliku s
ś
ść
ęś
ą
rozdzielone kropk . Istniej te pliki o specjalnych nazwach, które zwi zane s
ą
ą
ż
ą
ą
z urz dzeniami. Takimi plikami s
ą
ą LPR1 lub PTR zwi zane z drukark ,
ą
ą CON
zwi zany z konsol (klawiatura + ekran monitora),
ą
ą
COM1
zwi zany z portem
ą
szeregowym. Po skojarzeniu zmiennej plikowej z plikiem mo emy go otworzy .
ż
ć
W tym wypadku zachowanie poszczególnych procedur otwieraj cych ró ni si
ą
ż
ę
w zale no ci od typu otwieranego pliku. Dla plików tekstowych procedura
ż
ś
rewrite
tworzy nowy plik, który mo na wy cznie zapisywa . Procedura
ż
łą
ć
reset
otwiera istniej cy plik w trybie tylko do odczytu, natomiast procedura
ą
append
otwiera istniej cy plik w trybie do dopisywania, co oznacza, e nowe informacje
ą
ż
b d w tym pliku zapisywane za ju istniej cymi. Wszystkie te procedury, jako
ę ą
ż
ą
parametr wywo ania przyjmuj zmienn plikow skojarzon z plikiem, który
ł
ą
ą
ą
ą
ma zosta otwarty. W przypadku plików binarnych zdefiniowanych procedura
ć
rewrite
5
tworzy nowy plik, natomiast procedura reset otwiera plik, który już
istnieje. W obu przypadkach mo liwe jest odczytywanie i zapisywanie do pliku.
ż
Podobnie, jak poprzednio jedynym parametrem wywo ania tych procedur s
ł
ą
zmienne plikowe, na których operacja ma zosta wykonana. W przypadku
ć
plików amorficznych, procedury rewrite i reset maj takie samo dzia anie, jak
ą
ł
dla plików binarnych zdefiniowanych, ale mog przyjmowa dodatkowy
ą
ć
parametr wywo ania, b d cy liczb okre laj c wielko
(w bajtach) bloku, jaki
ł
ę ą
ą
ś
ą ą
ść
4 Dok adniej w systemie DOS, dla którego kompilator Turbo Pascala jest przeznaczony.
ł
5 Je li procedura
ś
rewrite
zostanie u yta dla istniej cego pliku, to skasuje jego zawarto
,
ż
ą
ść
niezale nie od jego typu.
ż
4
mo na jednorazowo zapisa lub odczyta z takiego pliku. Je li sami nie
ż
ć
ć
ś
okre limy rozmiaru bloku, to zostanie przyj ty rozmiar domy lny równy 128
ś
ę
ś
bajtów. Do odczytu plików tekstowych mo emy zastosowa znane ju nam
ż
ć
ż
procedury read i readln. Domy lnie te procedury zwi zane s z plikiem
ś
ą
ą
o nazwie Input, czyli po prostu z klawiaturą
6
. Je li jednak jako pierwszy
ś
parametr ich wywo ania podamy nazw zmiennej plikowej, to odczyt zamiast
ł
ę
z klawiatury b dzie odbywa si z pliku. Po nazwie zmiennej plikowej wyst puje
ę
ł
ę
ę
lista sk adaj ca si co najmniej z jednej zmiennej do której b d wczytane
ł
ą
ę
ę ą
informacje z pliku. Ró nica mi dzy
ż
ę
readln
i read polega na tym, e pierwsza
ż
odczytuje ca y wiersz znaków, zako czony znakami ko ca wiersza, natomiast
ł
ń
ń
druga czyta tyle informacji, ile wynika z liczby i typu zmiennych do których one
b d zapisywane. W przypadku plików binarnych zdefiniowanych odczyt
ę ą
mo liwy jest wy cznie za pomoc procedury
ż
łą
ą
read
. Pierwszym parametrem
wywo ania tej procedury jest zmienna plikowa, natomiast nast pnymi zmienne
ł
ę
(w liczbie co najmniej jeden), do których informacje b d zapisane. Typy tych
ę ą
zmiennych musz by takie same lub zgodne z typem elementów pliku.
ą
ć
W przypadku plików amorficznych odczyt jest mo liwy tylko za po rednictwem
ż
ś
procedury blockread. Ta procedura mo e przyjmowa trzy lub cztery parametry
ż
ć
wywo ania. Pierwszym jest zmienna plikowa, drugim zmienna do której ma
ł
zosta zapisana informacja, a trzecim zmienna, warto
lub wyra anie typu
ć
ść
ż
word
, okre laj ce ile bloków chcemy z pliku odczyta . Czwarty parametr
ś
ą
ć
wywo ania jest opcjonalny i jest nim zmienna typu
ł
word
, w której jest
zapisywana liczba faktycznie przeczytanych bloków. Je li nie umie cimy tego
ś
ś
argumentu na li cie parametrów wywo ania procedury
ś
ł
blockread
, to
w przypadku, kiedy zostanie odczytana mniejsza ni chcieli my liczba bloków
ż
ś
z pliku program zako czy si natychmiast sygnalizuj c b d wykonania. Je li
ń
ę
ą
łą
ś
przeka emy czwarty parametr, to mo emy obs u y ten wyj tek. Zapis do pliku
ż
ż
ł ż ć
ą
równie odbywa si w ró ny sposób, w zale no ci od rodzaju pliku. Do plików
ż
ę
ż
ż
ś
tekstowych mo emy zapisywa informacje za pomoc
ż
ć
ą write i writeln. Podobnie
jak w przypadku procedury read i readln domy lnie s one skojarzone
ś
ą
z plikiem Output, czyli ekranem monitora
7
. Je li jako pierwszy parametr
ś
wywo ania tej procedury umie cimy zmienn plikow , to zapis informacji
ł
ś
ą
ą
nast pi do pliku z ni zwi zanego. Za tym parametrem, mog wyst powa inne
ą
ą
ą
ą
ę
ć
b d ce zmiennymi, wyra eniami lub wprost - warto ciami, które maj zosta
ę ą
ż
ś
ą
ć
zapisane do pliku. Procedura writeln zapisuje do pliku wiersze zako czone
ń
znakami ko ca wiersza. Natomiast procedura
ń
write
nie umieszcza w pliku tych
znaków samodzielnie. Do zapisu plików binarnych zdefiniowanych u ywana
ż
jest wy cznie procedura
łą
write
. Sposób wywo ania tej procedury jest taki sam,
ł
jak w przypadku plików tekstowych. Pliki amorficzne mog by zapisywane
ą
ć
6 Plik skojarzony z klawiatur nazywany jest równie standardowym wej ciem.
ą
ż
ś
7 Plik ten nazywany jest równie standardowym wyj ciem.
ż
ś
5
przy pomocy procedury blockwrite. Jej parametry wywo ania s takie same, jak
ł
ą
w przypadku procedury blockread, z tym e odnosz si one do zapisu, a nie
ż
ą
ę
odczytu. Operacja zamykania pliku jest przeprowadzana w ten sam sposób dla
wszystkich rodzajów plików – przy pomocy procedury close. Jedynym
parametrem wywo ania tej procedury jest zmienna plikowa.
ł
5. Inne operacje zwi zane z plikami
ą
W j zyku Pascal zdefiniowano szereg procedur i funkcji, które wykonuj inne
ę
ą
pomocne operacje na plikach, ni te, które opisano wy ej. Oto niektóre
ż
ż
z nich wraz, z krótkim opisem:
funkcja eof zwraca warto
ść true, je li zosta osi gni ty koniec pliku.
ś
ł
ą
ę
Dzia a dla wszystkich typów plików. Jej parametrem wywo ania jest
ł
ł
nazwa zmiennej plikowej, je li zostanie ona pomini ta, to wywo anie to
ś
ę
ł
b dzie si odnosi o do standardowego wej cia,
ę
ę
ł
ś
funkcja seekeof dzia a podobnie, ale tylko dla plików tekstowych
ł
i ignoruje znaki bia e (spacja, powrót karetki, itp.),
ł
funkcja eoln dzia a jedynie dla plików tekstowych i zwraca
ł
true
, je li
ś
zosta osi gni ty koniec wiersza,
ł
ą
ę
funkcja seekeoln dzia a podobnie, ale ignoruje znaki spacji i tabulacji,
ł
jest przeznaczona wy cznie dla plików tekstowych,
łą
funkcja filesize zwraca liczb elementów pliku binarnego lub liczb
ę
ę
bloków pliku amorficznego,
funkcja filepos dzia a dla plików binarnych i amorficznych, zwraca
ł
warto
typu
ść
longint
, która oznacza pozycj wska nika pliku,
ę
ź
procedura seek ustawia pozycj wska nika pliku
ę
ź
8
. Pierwszym
argumentem jej wywo ania jest nazwa zmiennej plikowej, drugim warto
ł
ść
nowej pozycji wska nika pliku. Warto
ta jest typu
ź
ść
longint
. Procedura
seek
jest przeznaczona dla plików binarnych i amorficznych,
procedura truncate „ucina” plik pocz wszy od bie
cej pozycji wska nika
ą
żą
ź
pliku, dzia a dla plików binarnych i amorficznych,
ł
8 O wska niku pliku mo emy my le jak o indeksie tablicy. Jest on przesuwany automatycznie
ź
ż
ś ć
po wykonaniu ka dego odczytu lub zapisu zawarto ci pliku.
ż
ś
6
funkcja ioresult zwraca kod wykonania operacji na pliku, je li operacja
ś
przebieg a prawid owo, to kod ten jest równy zero, w przeciwnym
ł
ł
przypadku jest to warto
ró na od zera, aby ta funkcja dzia a a
ść
ż
ł ł
prawid owo nale y wy czy dyrektyw
ł
ż
łą
ć
ę $I kompilatora.
Opisana wcze niej funkcja
ś
eof
jest dosy cz sto stosowana, kiedy
ć
ę
konstruujemy p tl , w której umieszczamy instrukcje odczytuj ce z pliku. Je li
ę ę
ą
ś
jest to p tla
ę
while
, to warunek w tej p tli ma posta :
ę
ć not eof(zp), natomiast je li
ś
jest to p tla
ę
repeat ... until
, to warunkiem zako czenia jest
ń
eof(zp)
.
W przypadku plików binarnych i amorficznych mo liwe jest u ycie do odczytu
ż
ż
p tli
ę
for
. Poni ej znajduj si przyk ady programów operuj cych na
ż
ą
ę
ł
ą
odpowiednio: plikach tekstowych, binarnych i amorficznych.
7
program pliki_tekstowe;
uses crt;
var T:text;
procedure zapisz(var F:text);
{Zapisuje do pliku tekstowego 10 wierszy pobranych od u ytkownika.}
ż
var
a:string[80];
i:byte;
begin
rewrite(F);
for i:=1 to 10 do
begin
readln(a);
writeln(F,a);
end;
close(f);
end;
procedure odczytaj(var F:text);
{Odczytuje z pliku tekstowego 10 wierszy.}
var
Zmienna plikowa, typu text jest kojarzona z plikiem o nazwie dane.txt w bloku
g ównym programu. Plik ten tworzony jest w procedurze
ł
zapisz
, w wyniku
wywo ania procedury
ł
rewrite
. W tej te procedurze do pliku zapisywanych jest
ż
dziesi
wierszy (p tla
ęć
ę
for
) zawieraj cych ci gi znaków podane przez
ą
ą
u ytkownika (o wielko ci maksymalnie 80 znaków). Procedura
ż
ś
odczyt
odczytuje
te dane z tego samego pliku. Odczytanie i wy wietlenie na ekran odbywa si
ś
ę
wewn trz p tli
ą
ę
repeat
. W obydwu procedurach ostatni wykonywan instrukcj
ą
ą
ą
jest zamkni cie pliku.
ę
8
a:string[80];
begin
reset(F);
repeat
readln(f,a);
writeln(a);
until eof(f);
close(f);
end;
begin
clrscr;
assign(T,'dane.txt');
zapisz(T);
clrscr;
odczytaj(T);
readln;
end.
program plik_binarny;
uses
crt;
type
rec = record
x,y:integer;
end;
pl_rec = file of rec;
9
var
plik:pl_rec;
procedure zapisz(var f:pl_rec);
var
r:rec;
i:byte;
begin
{$I-}rewrite(f);{$I+}
if ioresult <> 0 then exit;
for i:=1 to 5 do
begin
with r do
begin
writeln('Podaj x');
readln(x);
writeln('Podaj y');
readln(y);
end;
write(f,r);
end;
close(f);
end;
procedure append_bin(var f:pl_rec);
begin
{$I-}reset(f);{$I+}
if ioresult <> 0 then halt(1);
seek(f,filesize(f));
end;
10
procedure dopisz(var f:pl_rec);
var
r:rec;
begin
writeln('Podaj x');
readln(r.x);
writeln('Podaj y');
readln(r.y);
append_bin(f);
write(f,r);
close(f);
end;
procedure wypisz(var f:pl_rec);
var
r:rec;
begin
{$I-}reset(f);{$I+}
if IOResult <> 0 then exit;
while not eof(f) do
begin
read(f,r);
write(r.x,' ');
write(r.y);
writeln;
end;
close(f);
end;
begin
clrscr;
assign(plik,'dane.dat');
zapisz(plik);
writeln('Naci nij Enter.');
ś
readln;
Powy szy program przetwarza informacje zawarte w pliku binarnym
ż
zdefiniowanym, którego elementami s rekordy. Taki rodzaj pliku nazywa si
ą
ę
krótko plikiem rekordowym. Ka dy rekord zawiera dwa pola
ż
x
i y, które
przechowuj liczby ca kowite. Zadaniem programu jest utworzenie pliku
ą
ł
o nazwie dane.dat, zapisanie do niego pi ciu rekordów zawieraj cych dane
ę
ą
pobrane od u ytkownika, zamkni cie go, nast pnie ponowne otwarcie,
ż
ę
ę
dopisanie jednego rekordu na ko cu tego pliku i wypisanie zawarto ci
ń
ś
wszystkich rekordów z pliku na ekran. Warto zwróci uwag na definicj pliku
ć
ę
ę
rekordowego, jak równie na procedur
ż
ę append_bin. Poniewa procedura
ż
append
dzia a tylko dla plików tekstowych, w programie zosta a zdefiniowana
ł
ł
osobna procedura dla plików binarnych zdefiniowanych. Otwiera ona taki plik
przy pomocy reset i ustawia jego wska nik za pomoc procedury
ź
ą
seek
za
ostatnim elementem pliku. Jego po o enie jest ustalane za pomoc funkcji
ł ż
ą
filesize
– elementy pliku s numerowane od zera, wi c pozycja ostatniego
ą
ę
elementu ma warto
równ liczbie elementów w pliku minus jeden. Warto
ść
ą
równie zauwa y , e wyj tki jakie mog spowodowa procedury otwierania
ż
ż ć ż
ą
ą
ć
plików s obs ugiwane za pomoc funkcji
ą
ł
ą
ioresult
. Aby nie by y one
ł
obs ugiwane domy lnie przez kompilator nale y wy czy przed wykonaniem
ł
ś
ż
łą
ć
danej operacji na pliku dyrektyw
ę $I kompilatora ({$I-}), a nast pnie w czy j
ę
łą
ć ą
po wykonaniu tej operacji ({$I+}). Podobnie mo na obs ugiwa wyj tki
ż
ł
ć
ą
pochodz ce od innych operacji na pliku, ale w ich przypadku w programie
ą
zosta a zostawiona obs uga domy lna. Funkcja
ł
ł
ś
ioresult
mo e odczyta kod
ż
ć
b du tych operacji tylko przy wy czonej dyrektywie
łę
łą
$I
.
11
clrscr;
wypisz(plik);
writeln('Naci nij Enter.');
ś
readln;
clrscr;
dopisz(plik);
wirteln('Naci nij Enter.');
ś
readln;
wypisz(plik);
writeln('Naci nij Enter.');
ś
readln;
end.
12
program plik_amorficzny_i_tablica;
uses
crt;
type
tablica_losowa = array [1..1000] of word;
var
tl:tablica_losowa;
pl:file;
procedure wypelnij_i_zapisz(var F:file; var x:tablica_losowa);
{Wype nia i zapisuje do pliku amorficznego tablic 1000 elementów typu word.}
ł
ę
var
l,i:word;
begin
randomize;
for i:=1 to 1000 do x[i] := random(100);
for i:=1 to 1000 do write(x[i]:4);
{$I-}rewrite(F,sizeof(x));{$I+}
if IOResult <> 0 then exit;
blockwrite(F,x,1,l);
if l<>1 then exit;
close(F);
end;
procedure odczytaj_i_pokaz(var F:file; var x:tablica_losowa);
{Wype nia tablic 1000 elementów typu word danymi z pliku.}
ł
ę
var
l,i:word;
begin
{$I-}reset(F,sizeof(x));{$I+}
if IOResult <> 0 then exit;
blockread(F,x,1,l);
if l<>1 then exit;
for i:=1 to 1000 do write(x[i]:4);
Ten program wype nia tablice o 1000 elementach typu
ł
word
i zapisuje j ,
ą
a nast pnie odczytuje z pliku amorficznego. Warto zwróci uwag na sposób
ę
ć
ę
u ycia procedur
ż
blockread
i blockwirte.
13
close(F);
end;
begin
assign(pl,'tablica.dat');
clrscr;
wypelnij_i_zapisz(pl,tl);
writeln('Naci nij Enter.' );
ś
readln;
clrscr;
odczytaj_i_pokaz(pl,tl);
writeln('Naci nij Enter.' );
ś
readln;
end.