File kezelés

A VIK Wikiből
A lap korábbi változatát látod, amilyen Ferrero (vitalap | szerkesztései) 2013. január 29., 18:52-kor történt szerkesztése után volt.
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
Ugrás a navigációhoz Ugrás a kereséshez

Fájl a C szempontjából kétféle van: szöveges (text file) és bináris (binary file). A különbség a használt műveletekben van: szövegfájlba írhatunk az fprintf-fel (a printf fájlba író testvére), olvashatunk sorokat, van fscanf és hasonlók. A rendszer tudja a fájlról (miután megmondtuk neki :) ), hogy az szöveg. A bináris fájl akármi lehet. A rendszer számára egy jókora bájtsorozat. A műveletek meg kb. annyiból állnak, hogy a memória bizonyos részeit (ahol nekünk változóink vannak) kimásoljuk fájlokba, máskor meg visszaolvassuk. (Itt nincs olyan, hogy sor vége meg ilyesmi... a programozó az egész adattömeggel azt kezd, amit akar, a fájlkezelő függvényeket ez nem érdekli...)

Bináris fájlok kezelésének legfontosabb függvényei: fopen, fwrite, fread, fflush, fclose.

Csatoltam egy példaprogramot is, amiben binárisan megnyitunk egy fájlt, beleírjuk egy (statikus) tömb tartalmát, majd betöltjük az adatokat a fájlból egy másik tömbbe.

Dinamikus lista és bináris file

A nagyházikban általában kell dinamikus lista és fájlkezelés is. Mivel egy dinamikus lista nem egy összefüggő területet foglal el a memóriában, ezért nem lehet egyetlen fwrite művelettel kiírni (illetve egyetlen fread-del beolvasni). Végig kell menni az összes elemén és egyenként egymás után kimenteni őket. (Ha több fwrite-ot hajtotok végre egy fájlra, az adatok szépen egymás után kerülnek bele, így egymás után be is lehet majd olvasni őket.)

Egy dolgokra viszont nagyon figyeljetek: ha dinamikusan foglaltok memóriát, akkor ott kaptok helyet, ahol éppen van! Legközelebb minimális az esély arra, hogy ugyanott kapjatok helyet. Ez viszont azt jelenti, hogy a dinamikus lista elemei máshol lesznek, ezért pointer értékeket ne írjatok ki fájlba, mert visszaolvasáskor azok értelmetlen helyekre mutatnak majd! A dinamikus listából csak azokat az adatokat mentsétek ki (és majd töltsétek be), amik nem a listával, hanem a tartalommal kapcsolatosak! Tehát a pointereket ne!

Dinamikus lista tartalmát úgy olvassuk be fájlból, hogy

  • A program létrehozza az új elemet (malloc, pointerek beállítása stb.), majd
  • Beolvassa a fájlból az adatokat (fread), de a pointereket nem bántja

(És természetesen kimenteni is ennek megfelelően kell az adatokat.)

A csatolt példaprogram bemutatja, hogyan lehet egy dinamikus lista tartalmát fájlba kimenteni, majd onnan betölteni. Ez jó eséllyel kell a nagyháziba is...

A szövegfájlok kezelésére is van itt egy rövid példa.