09. Állománykezelés

 

8. Állománykezelés


A programok a bemeneti adataikat nem csak a billentyuzetrol, hanem a háttértárolókon lévo állományokból is kaphatják, valamint kimeneti adataikat a képernyon történo megjelenítés mellett állományokban is tárolhatják. A Pascal nyelvben három összetett típus és az ezekhez kapcsolódó szabványos eljárások és függvények valósítják meg az állományok kezelését.

8.1 Típusos állomány

Deklarálása: FILE OF alaptípus
Összetett típus, fizikailag egy lemezes állomány. Egyforma méretu elemekbol (komponensekbol) áll. Az elemek számának csak a lemez mérete szab határt.
A típusos állományból való olvasás illetve az állományba való írás egysége a komponens.
Az elemekhez a rendszer sorszámot rendel 0-tól kezdodoen. Az elérés szekvenciálisa (Read, Write) vagy a komponensek sorszáma szerint direkt módon történhet (az állomány mutató mozgatásával).

A program mindig egy logikai állományt kezel, melyet hozzá kell rendelnünk egy fizikai állományhoz (Assign), majd használat elott meg kell nyitnunk. A Rewrite eljárás létrehozza, és megnyitja a logikai fájlhoz rendelt fizikai állomány. Ha a fizikai fájl már létezett, akkor törli annak tartalmát. A Reset eljárással egy már létezo állományt nyithatunk meg. Ekkor az állománymutató az 0. komponensre áll. (Ezért ezt az eljárást használhatjuk egy nyitott állomány elejére való ugrásra is.) Használat után a Close eljárással zárjuk le fájlunkat!

A típusos állományból a Read eljárás olvas be változókba adatokat. Ügyeljünk arra, hogy a változó típusa egyezzen meg a fájl alaptípusával! Beolvasás után az állomány mutató automatikusan a következo komponensre lép (szekvenciális elérés). Egy változó (vagy kifejezés) értékét a Write eljárással írhatjuk ki egy fájlba. Hasonlóan az olvasáshoz a változó típusának meg kell egyeznie a fájl elemeinek a típusával, valamint az eljárás után az állomány mutató továbblép. Ha az állomány mutató a fájl végén (az utolsó elem mögött) áll, akkor az Eof függvény értéke True. Nézzünk egy példát a fájl szekvenciális feldolgozására:

Reset(f)
while not Eof(f) do
begin
Read(f,v);
{a v változóban lévo adat feldolgozása}
end;
Az állomány mutató direkt pozicionálását a Seek eljárás valósítja meg. A FilePos függvénnyel lekérdezhetjük az aktuális pozíciót, a FileSize függvény pedig az állomány elemeinek a számát (méretét) adja vissza. Példák a pozicionálásra.
Az I/O muveletek során nagy a hibalehetoség (pl. a lemezegység, fájl nem elérheto). Az esetleges futási hibákat tudnunk kell kezelni, ha megbízhatóan muködo programot szeretnénk írni. Ha az I/O muveletek ellenorzése aktív (ez az alapértelmezés), akkor programunk futási hibával leáll egy I/O hiba esetén. Ezért I/O muveletek ellenorzését inaktívvá kell tennünk a {$I-} fordítási direktívával a kényes muveletek esetén. A muvelet után az esetleges hiba kódját az IOResult függvénnyel kérdezhetjük le. Erre egy példa:

Assign(f, 'adatok.dat');
{$I-}
Reset(f); {megpróbáljuk megnyitni a fájlt}
{$I+}
if IOResult <> 0 then {ha hiba történt, tehát a fájl nem létezik, }
Rewrite(f); {akkor létrehozzuk az állományt}
A Truncate eljárással levághatjuk a fájl komponenseit az aktuális pozíciótól kezdodoen.
Lezárt állományokra használhatjuk a Rename valamint az Erase eljárásokat a fájlok átnevezésére illetve törlésére.

Példa:
1. A program egy bolt árucikkeinek adatait (név, kód, ár) tárolja és kezeli egy állományban.
Megoldás

 

8.2 Szöveges állomány - Text


Deklarálása: TEXT
A Pascal programban szöveges állományként kezelhetjük az egyszeru ASCII szövegeket. (Például a .pas kiterjesztésu forrásprogramjainkat.) A szöveges állomány változó hosszúságú sorokból áll, melyeket a sorvégjel zár le (CR/LF). Az állományt az állományvégjel zárja(^Z). Az Eoln illetve az Eof függvény értéke True, ha az aktuális pozíció egy sorvégjelen vagy az állomány végén áll. A SeekEoln illetve a SeekEof függvények az állomány következo TAB szóköz illetve TAB szóköz és sorvégjel karaktereit átugorva tájékoztatnak arról, hogy sorvégjelen illetve az állomány végén állunk-e.
A szöveges állományt csak szekvenciálisan érhetjük el. Az állomány csak olvasásra vagy csak írásra lehet megnyitni. Az állományból olvasni a Read, ReadLn, illetve írni a Write, Writeln eljárásokkal tudunk. Ha az eljárásoknak a fájl azonosító paraméterét elhagyjuk, akkor az olvasás / írás az alapértelmezett input / output szöveges állományból / -ba történik, ami a billentyuzet illetve a monitor. Szöveges állományból (azaz a billentyuzetrol is) olvashatunk egész, valós, karakteres és sztring típusú változokba adatokat. Az állományba az elobbi típusokon kívül még logikai értéket is kiírathatunk.
Az fizikai állományhoz az Assign eljárással rendelhetünk egy Text típusú változót, azaz a logikai állományt. A Rewrite eljárás csak írásra nyitja meg a szöveges állományt, ha nem létezett létrehozza, egyébként törli a tartalmát. A Reset eljárással csak olvasásra nyithatunk meg egy már létezo fájlt. Az Append eljárás egy létezo állományt nyit meg írásra, és az állománymutató a fájl végére állítja. Az állományt a Close eljárással zárhatjuk be.
Az I/O muveletek hibakódját az IOResult függvény adja vissza (bovebben ld. Típusos állományok).
Lezárt állományokra használhatjuk a Rename valamint az Erase eljárásokat a fájlok átnevezésére illetve törlésére.
A Fluss és a SetTextBuf eljárásokkal az írás, olvasás során a rendszer által használt átmeneti tárolóhoz (pufferhez) férhetünk hozzá.

Példa:
1. A doga.txt állományban egy feladatsor van, kérdések és válaszok felváltva egymás után. Minden kérdés illetve válasz új sorban kezdodik. A kérdések egy számjeggyel kezdodnek, és kérdojellel fejezodnek be. Készítsünk két új szöveges állományt úgy, hogy az egyik csak a kérdéseket, a másik pedig csak a válaszokat tartalmazza.
Megoldás

 

8.3 Típusnélküli állomány


Deklarálása:
FILE
Általában gyors adatmozgatás vagy ismeretlen állomány esetén használjuk. Hasonló a típusos állományhoz, de az elemeinek nem a típusa, hanem a hossza a lényeges. A komponensek hosszát a fájl megnyitásakor adhatjuk meg (Reset, Rewrite), az alapértelmezés 128 bájt. Az állomány írható, olvasható, az elérés szekvenciálisan (BlockRead, BlockWrite eljárásokkal) vagy az elemek sorszáma szerint direkt módon történhet.

További függvények, eljárások: Assign, Close, Eof, Erase, FilePos, FileSize, IOResult, Rename, Seek, Truncate

Példa:
1. Tördeljünk szét egy állományt egy kilobájt hosszúságú kisebb állományokra!
Megoldás





A cikk tulajdonosa: RedQueen
http://RedQueen.uw.hu

A cikk webcíme:
http://RedQueen.uw.hu/modules.php?name=Sections&op=viewarticle&artid=53