File kezelés
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.