Fájlkezelés-2
vitafórum(0)
szerző: elodanidátum: 2009-08-14
Kategóriák:
Pascal/Alapok
Nos az előző részben megnéztük mi van a szöveges fájlokkal. Most lássuk a többit!
A Típusos fájlok:
Ennek is be kell vezetni egy változót:
var file of típusnév;
ahol típusnév az a típus amiket a fájlunk tartalmaz.
Ezt is hozá kell rendelni egy fájlhoz a már jól ismert assign(fájl_valtozo) függvénnyel. Ezúttal a megnyitás előtt nem kell meggondolnunk, hogy most olvasni vagy írni akarunk a fájlba, mert ez teljesen mindegy. Azt kell csak eldönteni, hogy egy létező fájlt akarunk megnyitni, vagy pedig egy új fájlt akarunk létrehozni/létezőt felülírni.
Minkét esetben tudunk írni és olvasni is a fájlból.
reset(fájl_változó);
rewrite(fájl_változó);
Mindkét megnyitási mód után az aktuális pozíció a fájl elejét jelöli.
A típusos fájlok feldolgozása történhet szekvenciálisan illetve direkt módon. A direkt módon történő feldolgozás lényegesen hatékonyabb, hisz a lényege annyi, hogy a fájlban mi pozícionálunk, ezáltal azon az elemen végezzük el műveleteinket amelyiken akarjuk. Ez a pozícionálás nem egyirányú, vagyis nem kell mindig a fájl elejéről indulni, bárhonnan bármerre mozoghatunk, mert minden elemnek van egy sorszáma, ami által elérhetjük. Ezzel szemben az előző rész szöveges fájljait csak szekvenciálisan tudtuk feldolgozni.
az adatok írására a Write olvasására a Read függvényt használjuk.
Így:
read(fájl_valtozo, valtozolista);
Ez az aktuális pozíciótól olvassa be az adatokat a fájlból a változólista változóiba.
write(fájl_valtozo, valtozolista);
Ez pedig az aktuális pozíciótól kezdve írja be a változólista elemeit a fájlba.
A közvetlen pozícionáláshoz a seek(fájl_valtozo, index) függvényt használjuk.
ezen kívül még hasznos függvények:
filesize(fájl_valtozo)->az elemek számát adja vissza
filepos(fájl_valtozo)->az aktuális pozíciót adja vissza (az első a 0.)
értelemszerűen, ha elérkeztünk az utolsó elemhez akkor a fenti 2 függvény ugyanazt az értéket adja vissza )
+ még van a truncate(fájl_valtozo) -> ami az aktuális pozíciótól kezdve levágja a fájl maradékát és a fájl végét az aktuális pozícíóra teszi.
és itt is használhatjuk az eof függvényt
Típus nélküli fájlok:
Ennek a deklarálása:
var fájl_valtozo: file;
És ismét az assign függvény....
Itt az egy lépésben elérhető egység a blokk, ami alapértelmezetten 128 bájt, de ezt mi is beállíthatjuk.
megnyitás:
reset(fajl_valtozo, blokk_meret);
rewrite(fajl_valtozo, blokk_meret);
Írás/ olvasás:
BlockRead(fájl_valtozo, puffer, darab);
Blockwrite(fájl_valtozo, puffer, darab);
a paraméterek:
fájl_valtozo a már unalomig ismételt első paraméterben adjuk meg, melyik fájlon dolgozunk.
a puffer változóba olvassuk be az adatokat.
És a darab mondja meg. hogy hány ilyen blokkot szeretnénk beolvasni.
ezeken kívül itt is használható a seek, filepos, truncate, eof függvények.
a filesize itt a (fájl_fizikai_mérete/blokk_mérete) értéket adja vissza.
A típusos és a típus nélküli fájlokat is be kell zárni!
Ma még nem volt példaprogram, szóval nézzünk egyet a típus nélküli fájlokra:
- program masol;
- var eredeti,masolat:file;
- hely,ujhely:string;
- adat:word;
- begin
- writeln('A fajl neve es eleresi utja:');
- readln(hely);
- assign(eredeti,hely);
- writeln('Az uj fajl neve es eleresi utja:');
- readln(ujhely);
- assign(masolat,ujhely);
- {$I-}
- reset(eredeti,1);
- rewrite(masolat,1);
- {$I+}
- if IOresult<>0 then begin
- writeln('HIBA! a fajl nem talalhato, vagy rossz eleresi ut');
- readln;
- halt;
- end else begin
- repeat
- blockread(eredeti,adat,sizeof(adat));
- blockwrite(masolat,adat,sizeof(adat));
- until eof(eredeti);
- close(eredeti);
- close(masolat);
- Writeln('A fajl masolasa sikeresen befejezodott.');
- readln;
- end;
- end.
Úgy érzem az egyetlen ismeretlen dolog ebben a sizeof(adat) lehet.Ez a függvény a paraméterben kapott változó méretét adja vissza bájtban. Ez azért van benne mivel a blokkméretet 1 bájtra állítottuk, de az adat változónk word típus tehát 2 bájtos. így egyszerre 2 bájtot olvasunk és írunk.
Aki nem hiszi járjon utána...
