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., 20:50-kor történt szerkesztése után volt.
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

Ezen a helyen volt linkelve a(z) dinlist_file.c nevű fájl ("csatolt példaprogram" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Infoalap/Prog1BinaryFile oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)
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:

Ezen a helyen volt linkelve a(z) szovegfajl.c nevű fájl ("szovegfajl.c" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Infoalap/Prog1BinaryFile oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)


-- Kristof - 2006.12.05. -- Kristof - 2007.11.19.