Navigation


RSS: tutorialok Jelenleg 5 vendég és 0 tag van az oldalon.

Fájlkezelés-2

szerző: elodani
dá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:

  1. program masol;
  2.  
  3. var eredeti,masolat:file;
  4.     hely,ujhely:string;
  5.     adat:word;
  6.  
  7. begin
  8.  
  9.    writeln('A fajl neve es eleresi utja:');
  10.    readln(hely);
  11.    assign(eredeti,hely);
  12.  
  13.  
  14.    writeln('Az uj fajl neve es eleresi utja:');
  15.    readln(ujhely);
  16.    assign(masolat,ujhely);
  17.  
  18.  
  19.    {$I-}
  20.      reset(eredeti,1);
  21.      rewrite(masolat,1);
  22.    {$I+}
  23.  
  24.    if IOresult<>0 then begin
  25.  
  26.         writeln('HIBA! a fajl nem talalhato, vagy rossz eleresi ut');
  27.         readln;
  28.         halt;
  29.  
  30.    end else begin
  31.  
  32.    repeat
  33.  
  34.       blockread(eredeti,adat,sizeof(adat));
  35.       blockwrite(masolat,adat,sizeof(adat));
  36.  
  37.    until eof(eredeti);
  38.  
  39.    close(eredeti);
  40.    close(masolat);
  41.  
  42.    Writeln('A fajl masolasa sikeresen befejezodott.');
  43.    
  44.    readln;
  45.  
  46.    end;
  47. 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...