Adatállományok
Az állományok használatára a Turbo Pascal tartalmuk szerint három lehetőséget kínál: Szöveges (text) Típusos fájl Típus nélküli fájl
Típusos állomány: -direkt szervezésű állomány. -a kiírás/beolvasás egysége a komponens -a komponensek egyforma típusúak, mely típus az állományra jellemző -a komponens hosszát a típus határozza meg -a komponensek sorszámozva vannak 0-tól -akármelyik sorszámú elemre közvetlenül pozícionálhatunk -szekvenciálisan is feldolgozhatjuk a komponensek fizikai sorrendjében (sorszámok szerint)
Típusnélküli állomány: -direkt szervezésű állomány -a komponensek hosszúsága tetszőlegesen megadható, azt nem a típus határozza meg -akkor használjuk amikor csak az számít, hogy hány byte- ot írunk ki/ olvasunk be egyszerre Szöveges állomány: -soros szervezésű állomány -sorokból, karakterekből, „sor vége” jelből áll -a kiírt/ beolvasott adatok váltakozó hosszúságúak, fizikai címét nem lehet sorszám alapján megállapítani, ezért az adatokat nem lehet direkt módon elérni
változónév: file of típus; {típusos} változónév: file; {típus nélküli} Ahhoz hogy a Pascalból használni tudjunk egy fájlt, szükség van: a fájlváltozót a fájl típusától függően deklaráljuk: változónév: text; {szöveges} változónév: file of típus; {típusos} változónév: file; {típus nélküli}
assign (fájlváltozó, fájlnév); a fájlváltozó létrehozása után, az assign eljárással össze kell rendelni a fájlváltozót egy létező vagy egy új állomány nevével: assign (fájlváltozó, fájlnév); A file neve előtt a fájlhoz vezető utat is megadhatjuk, nem haladhatja meg a 79 karaktert. Az elérési utat mindig meg kell adni, ha az állomány nem az aktuális könyvtárban van. Pl. var a: text; b: file of integer; begin … assign(a, ‘kerdesek.txt’); assign(b, ‘c:\dolgozat\adatok.dat’); end.
a felhasználni kívánt állományok megnyitása: reset (fájlváltozó); rewrite (fájlváltozó); append (fájlváltozó);
Reset= létező állomány nyitható meg. A nyitás után az eof függvény true értékkel jelzi, ha a fájl üres. A fájlpozíció az állomány elején van. Rewrite= új állomány létrehozása, vagy már meglévő állomány újraírása. A fájlpozíció az állomány elején van. Append= létező szöveges állomány megnyitása hozzáírásra. A fájlpozíció az állomány végén van.
Munkánk végeztével a fájlt a close eljárással kell lezárni: close (fájlváltozó); Ez a lépés különösen fontos, ha az adatállomány tartalmát módosítottuk. A close eljárás felfrissíti az állományt, így az utoljára végzett műveletek eredménye is megjelenik a lemezen tárolt állományban.
2. Szöveges állományok (szövegfájlok) -karaktereket tartalmazó különböző hosszúságú sorokból épülnek fel -minden sort az EOLN (End Of Line, billentyűzetről: Enter) jel zár le, az egész állományt pedig az EOF (End Of File, billentyűzetről: Ctrl+Z) jel zárja (hiányozhat a file végéről) -tetszőleges szövegszerkesztővel hozhatjuk létre, módosíthatjuk -tartalmát mindig a legelső sortól kezdve egyesével olvashatjuk, írhatjuk (kivétel az append eljárással hozzáírásra nyitott állományok, mivel ekkor az írás a már meglévő fájl utolsó sora után kezdődik).
-A szövegfájl deklarálása: var fájlváltozó: text; -megnyitása előtt meg kell mondanunk, hogy a fájlváltozóhoz melyik külső állományt rendeljük: assign (fájlváltozó, fájlnév); -írásra, hozzáírásra vagy olvasásra nyithatjuk meg a szövegfájlt: rewrite (fájlváltozó); {létező állomány} append (fájlváltozó); {létező állomány} reset (fájlváltozó); {új fájlt hozunk létre}
A szöveges állományok I/O műveletei: ha a fájlt írásra nyitottuk meg (rewrite, append): write és writeln: write( fájlváltozó, kifejezéslista); ha a fájlt olvasásra nyitottuk meg: read és readln: read(fájlváltozó, kifejezéslista); A sorok végének érzékelése: eoln( fájlváltozó) ; seekeoln( fájlváltozó); A fájl végének ellenőrzése: eof( fájlváltozó); seekeof( fájlváltozó);
Az állományt soronként olvasó program fő ciklusa: while not eof(f) do begin readln(f, sor); … end; Ha az állomány biztosan tartalmaz sorokat, akkor: repeat until eof(f);
Szöveges állományt feldolgozó Pascal programok szerkezete: Program Textfile; Type ptype=array[1..4096] of char; Var f :text; {a fájlváltozó f, típusa text} puffer :ptype; {4 kilobájtos fájlpuffer} v1, v2 :integer; Begin assign(f, ‘szov.txt’); {a Pascal fájlváltozó és a DOS állomány összerendelése} settextbuf(f,puffer); {I/O puffer hozzárendelése az állományhoz} reset(f); {az állomány megnyitása: olvasásra, vagy rewrite(f); létrehozással írásra append(f); hozzáírásra} read(f, v1, v2); {a fájlkezelés lépései: -a reset után: adatok olvasása a fájlból readln(f, v1, v2); teljes sor olvasása a fájlból if eof(f) then … a fájl végének tesztelése, vagy if seekeof(f) then … if eoln(f) then … a sor végének tesztelése if seekeoln(f) then … write(f, v1, v2+30); -a rewrite és az append után: adatok írása a fájlba writeln(f, v, v2+7); teljes sor írása a fájlba} flush(f); {a puffertartalom kiírása a fájlba} close(f); {bármely megnyitási mód esetén a fájl programok lezárása} End.
program olvaso; {Megadott szöveges állomány tartalmát jeleníti meg a pernyőn} Var tf : text; fn, sor : string; puffer : array[1..5120] of char; { 5K puffer } begin write('Kérem a fá jl nevét: '); readln(fn); assign(tf,fn); settextbuf(tf,puffer); {$I-} reset(tf); {ellenőrzési direktívák} if ioresult<>0 then writeln('A(z) ',fn,' nevű fájl nem olvasható!'); exit; end; {$I+} while not eof(tf) do readln(tf,sor); writeln(sor); end; close(tf); readln; end.
Feladatok: Mátrix Olvassatok be egy mátrixot a matrix.txt nevű fájlból. A fájl a következőket tartalmazza: -az első sorban m sor és n oszlop -minden sorban a mátrix elemei szóközzel vannak elválasztva egymástól. Cseréljétek fel a mátrix két sorát, majd a kapott mátrixot írassátok ki a matrixki.txt fájlba.} Gyakorló feladatok 1 Kérjetek be mondatokat, úgy, hogy az a képernyőn is megjelenjen. Egy mondat bármilyen hosszú lehet, végét az enter leütése jelzi(#13). Írjátok fel a mondatokat egy szöveges állományba, úgy hogy minden mondat végéhez hozzáfűzitek a STOP szöveget. A felvitel akkor fejeződik be, ha leütötték a CTRL+Z (#26) billentyűt. Ha az állomány már létezett akkor bővítsed azt.
Gyakorló feladat 2 Hozzatok létre egy olyan szöveges állományt, mely sorokból áll és a sorok számokat tartalmaznak. A számokat legalább egy szóköz vagy Tab választja el. Írjatok egy programot, amely az előbbi szöveges állományban található számokat soronként átlagolja és kiírja az eredményeket a sor számával együtt. Gyakorló feladat 3 A szoveg_be.txt állomány szavakat tartalmaz, mindenik sorban egy-egy szó. A szavak száma nem ismert. A szovek_ki.txt állományban írassátok ki az eltérő szavakat egyszer és azok előfordulásának számát is. Tehát mindenik sorban egy szó áll, mellette pedig az előfordulásának értéke, egy szóközzel elválasztva egymástól. pl. 'szoveg_be.txt' 'szovek_ki.txt' jó jó 3 szuper szuper 2 jó jeles 1 jeles szuper jó
Gyakorló feladat 4 Számsorozatot olvasunk ki a sorozatbe.txt szöveges állományból.A sorozat mindenik elemét egy- egy sorba írtuk, szóközzel elválasztva egymástól. Az elemek száma nem ismert. A sorozatki.txt állományba írassunk ki két számsorozatot az alábbi módon: - az első sorba a páros számok, míg a második sorba a páratlan számok kerülnek. Gyakorló feladat 5 Egy szöveges állományban tároljátok el egy vállalat dolgozóinak adatait: - az első sorban írjátok be hogy hány dolgozó adatait dolgozzuk fel - a következő sorokban egymás alá, minden dolgozó nevét és minden név mellé feltüntetve a bérét. Olvassátok be a szöveges állomány tartalmát és dolgozzátok fel az adatokat: - kinek van a legkisebb fizetése, és a legnagyobb - mi lesz a vállalat átlegbére
n-nél kisebb vagy egyenlő természetes számokat, amelyre teljesül a Gyakorló feladat 6 Egy 'teljesnegyzet.txt' nevű szöveges állományban írassatok ki az összes n-nél kisebb vagy egyenlő természetes számokat, amelyre teljesül a következő feltétel: -a szám és a szám tükörképének összege egy teljes négyzet pl. 29+92=121 és 121 egy teljes négyzet, gyökei: +11 es -11 Minden sorban egy-egy szám szerepeljen.
3. Típusos fájlok -azonos típusú adatelemekből épülnek fel, amelyek a fájl és az objektumtípus kivételével bármilyen lehet -az adatelemek azonos mérete lehetővé teszi, hogy az adatokat szekvenciálisan és közvetlen (direkt) módon is elérjük -a fájlban tárolt adatelemek a felírás sorrendjében 0-tól kezdve egyesével sorszámozódnak; a sorszám felhasználásával az állomány tetszőleges elemére pozícionálhatunk. 0.adatelem 1.adatelem A típusos fájl szerkezete … n. adatelem A különböző fájlkezelő rendszerek az állományok adatelemeit általában rekordnak nevezik, azonban a típusos fájlok rekordjainak jelölésére az elem és az adatelem szavakat használjuk.
A típusos fájlok esetén felhasználható Turbo Pascal eljárások és függvények: Program típusos_file; Type tipus= record {a file típusa} a : integer; s : string[30]; end; var f: file of tipus; {fájlváltozó} a,b: típus; p: longint; Begin assign(f, ‘adat.dat’); {összerendelések} reset(f); {létező állomány megnyitása írásra/ olvasásra} rewrite(f); {új állomány megnyitása írásra/ olvasásra} write(f, a, b); {fájlműveletek:-írás a file- ba read(f, a); -olvasás a file- ból seek(f, 2); -pozicionálás a file-ban truncate(f); -a file csonkitása:a fájl végéről eltávolítjuk a fölösleges elemeket} p:=filepos(f); { információs függvények: -aktuális fájlpozició p:=filesize(f); -a fájlban található elemek száma} if eof(f) then … {a fájl végének tesztelése} close(f); {a file lezárása} End.
4. Típus nélküli fájlok A típusnélküli fájlok használata segítséget jelent ismeretlen, nem szabályos szerkezetű állományok feldolgozásában. A számítógépen tárolt állományok többsége nem tagolható szövegsorokra és a bennük tárolt adatelemek mérete sem azonos. Az ilyen állományokat sem szöveges, sem pedig típusos fájlként nem kezelhetjük. A típusnélküli fájlokkal végzett műveletek során egyetlen lépésben elérhető adategység az adatblokk. A blokkméret alapértelmezés szerint 128 bájt, de ez a fájl nyitásakor a reset és a rewrite eljárások második paraméterével módosítható. (leghatékonyabb a fájlkezelés ha a blokkméret 512 vagy ennek többszöröse) pl.: assign(f, ‘akármi.dat’); reset(f, 512);
Típusnélküli fájlok kezelése: Program Tipus_nelkuli_file; Const bs= 512; {blokkméret} pm= 4; {a puffer mérete blokkokban} Var f: file; {a fileváltozó} p: longint; {fájlpozició} puf: array[1..pm*bs] of byte; {puffer} nok: word; {sikeres blokkok száma} Begin assign(f, ‘fájlnév’); {összerendelés} reset(f); {az állomány megnyitása: - létező fájl írásra/olvasásra vagy reset(f, bs); rewrite(f); - új fájl írásra/olvasásra vagy rewrite(f, bs);} blockwrite(f, puf, pm); {fájlműveletek: -blokkok írása a fileba blockwrite(f, puf, pm, nok); blockread(f, puf, pm); -blokkok olvasása a file-ból blockread(f, puf, pm, nok); seek(f, p); -poziciónálás a fileban truncate(f); -a fájl csonkítása} p:=filepos(f); {aktuális fájlpozició} p:=filesize(f); {a fájlban található blokkok száma} if eof(f) then … {a file végének tesztelése} Close(f); {a file lezárása} End.
Összefoglaló feladatok: Írj programot! Az első program hozza létre és töltse fel a következő típusú rekordokat tartalmazó állományt: type szg= record {számítógép rekord} tipus: string[12]; ear: real; {egység ár} db: integer; memkb: integer; {memória Kb} end; A másik program jelenítse meg a fájl tartalmát és összegezze a rekordok ear nevű mezőjét.
Példafeladat típusos fájlok használatára: Adott szerkezetű állomány létrehozása és elérése: Írj egy programot (keszit.pas), amely létrehozza és feltölti a meres.dat állományt, majd egy másik programot (dolgoz.pas) amely feldolgozza és megjelenití a képernyőn a meres.dat állományban tárolt adatokat.