| kategória | ||||||||||
| 
 
 
  | 
                ||||||||||
| 
 
  | 
                ||
Fájlkezelés a C programnyelvben: A szabványos fájlkezelés alapjai. A magas szintű fájlkezelés.
A C- ben egy file-t egy olyan pointerrel tudunk azonosítani ami egy FILE típusú struktúrára mutat. A FILE egy struktúra típusnév definíció, mely struktúra tartalmazza az aktuális file-lal kapcsolatos információkat (pld. azt, hogy a file írás vagy olvasás alatt áll). Az <stdio.h>-ban található az _iobuf struktúra deklarálása, és utána a "typedef struct _iobuf FILE ;" típusnév definíció.
Szabványos be és kimenet átirányítása
Alapesetben egy C program a klaviatúrát
használja bemenetként, és a képernyôt használja kimenetként. Abban az esetben,
ha a programot a következôképpen indítjuk :
 rendez <
adatok.txt
akkor a rendez nevű program nem a klaviatúráról, hanem az adatok.txt állományból
olvassa az adatokat. Abban az esetben, ha az alábbi módon indí 242j97c tjuk :
 rendez >
r_adatok.txt
akkor nem a képernyôre írja ki a rendezett adatokat, hanem az r_adatok.txt állományba.
File deklaráció
A file deklarációja az úgynevezett állománymutató segítségével történik, ami a már említett FILE típusú struktúrára mutat :
FILE < állománymutató >; 
Példa file definícióra : FILE *fp;
Ezekután az fp pointerrel hivatkozhatunk a file-ra, a használat során.
File megnyitása
A file megnyitása az fopen() függvénnyel történik, ami egy FILE * típusú pointert ad vissza. Az fopen() függvénynek két char * típusú bemenô paramétere van. Az elsô a megnyitandó állomány neve, a második a megnyitás módja :
 <állománymutató> = fopen( <filenév> , <mód >);
Alapesetben háromféle megnyitási módról
beszélhetünk :
 1. Megnyitás olvasásra :
"r" File pointer az állomány
elejére áll.
 2. Megnyitás írásra  : "w" File pointer az állomány elejére áll.
 3. Megnyitás
hozzáfűzésre : "a" File pointer az állomány végére áll.
Az "r" mód alkalmazása esetén a file-nak természetesen léteznie kell ! A "w" mód alapesetben egy új file-t kreál írásra. Ha a "w" módot egy már meglévô file esetén alkalmazzuk, akkor számolnunk kell azzal, hogy a file tartalma felülíródik ! A hozzáfűzésre való megnyitás ( "a" ) esetén a file írható, - a file végétôl. Ebben az esetben a meglévô file tartalma nem íródik felül ! Ha a file nem létezik, akkor a "w" módhoz hasonlóan egy új file jön létre - írásra.
Az alapesetet a + (plusz) karakterrel tudjuk módosítani, ha a feladat úgy kívánja !A + karaktert az aktuális mód karakteréhez egyszerűen hozzá kell fűzni, így az alap megnyitási módok a következôképp módosulnak :Az "r+" mód csakis egy létezô file-ra vonatkozik. A file-t olvasásra és írásra nyitja meg ( update ). A "w+" mód egy üres file-t nyit meg irásra és olvasásra. A file-nak tehát nem kell léteznie ! Létezô file esetén a file tartalma felülíródik ! Az "a+" mód olvasásra és hozzáfűzésre nyitja meg a file-t. Ha a file még nem létezik, akkor új file-t nyit meg. Minden írási művelet a file végén történik, így egy meglévô file tartalma nem íródik felül !
Ha ASCII állományról van szó akkor a "t", ha bináris állományról akkor a "b" üzemmódot használjuk, az ennek megfelelô karaktert hozzá kell fűzni az elôbb ismertetett karakterek valamelyikéhez. Az alapértelmezés a text üzemmód !
Példa file megnyitásra :
 fp =
fopen("adatok.txt","rt"); //
Az adatok.txt file megnyitása olvasásra, text üzemmódban.
A gyakorlatban természetesen a file megnyitással együtt hiba vizsgálatot is végzünk, hiszen az fopen() függvény NULL pointert ad vissza, ha a megnyitás valamilyen oknál fogva nem sikerült ! (Például nem létezô file-t akartunk megnyitni)
File írása
Ha "w" módban nyitottunk meg egy file-t, akkor az írás mindig a file elejétôl történik, így a file-ban lévô adatok felülíródnak !
Egy karakter kiírása : int fputc( int c, FILE *f )
 ahol :
 c : a kiirandó
karakter,
 f : a file
struktúrára mutató pointer
 Az
fputc() normál esetben a kiírt karaktert adja vissza, hiba esetén pedig 
 az EOF-ot.
Formátumozott változólista kiírása : int fprintf( FILE *f ,char *fs ,
<args> )
 ahol :
 f : a file struktúrára mutató pointer
 fs : a formátum
vezérlô string
 <args> :
változó(lista)
Az fprintf() a kiírt karakterek számát adja vissza. Látható, hogy az fprintf()
használata teljesen megegyezik a printf() függvényével, a FILE típusú
pointertôl eltekintve.
File olvasása
Egy karakter beolvasása : int fgetc( FILE *f )
 ahol :
 f : a file
struktúrára mutató pointer
Az fgetc() normál esetben a beolvasott karaktert adja vissza, hiba esetén pedig az EOF-ot. A file pointert automatikusan a következô beolvasandó karakterre állítja.
Formátumozott változólista beolvasása :   int fscanf( FILE *f , char fs,<args>)
 ahol :
 f: a file
struktúrára mutató pointer
 fs : a formátum
vezérlô string
 <args> :
változócím(lista)
Az fscanf() a beolvasott karakterek számát adja vissza. Látható, hogy az
fscanf() használata teljesen megegyezik a scanf() függvényével, a FILE típusú
pointertôl eltekintve.
File lezárása
 int
fclose(f) ; ahol f egy FILE
típusú pointer.
Az fclose() függvény 0-át ad vissza akkor, ha a file lezárása sikeresen
megtörtént. Ellenkezô esetben EOF-ot ad vissza a függvény.
/* Adatok irása il. olvasása file használattal */
 /* fprintf(), fscanf() */
 #include <stdio.h>
 #define SIZE 5
 struct szemely
 ;
 void main()
 
 psz
= &szm[0] ;
 // A
struktúra feltöltése adatokkal
 sz_load( psz ); 
 //
File megnyitás írásra
 if(
(fp=fopen("szemely.dat","wt")) == NULL )
 
 //
Kiiratás file - ba
 for(i=0; i<SIZE;
i++) 
 
 // Az
írásra megnyitott file lezárása
 fclose(fp); 
 //
File megnyitás olvasásra 
 if( (fp=fopen("szemely.dat","rt"))
== NULL ) 
 
// Beolvasás file - ból
 for(i=0;
i<SIZE; i++) 
 
  // Az olvasásra megnyitott file lezárása
 fclose(fp);
 }
 void sz_load( struct szemely *p_sz
)
 
 } 
File elejére történô pozicionálás
 void
rewind( FILE *f );
 ahol  :
 f  :
A file struktúrára mutató pointer.
 A
függvény hatására a file pointer a file elejére fog mutatni, és bármilyen író, 
 vagy olvasó művelet a file
elejétôl lesz érvényes. Csak
"a+" olvasás+hozzáfűzés 
 üzemmódban hatásos !
Adategység
formátum nélküli kiiratása file-ba
 int fwrite( char
*buffer, int size, int count, FILE *f );
 ahol :
 buffer : Az a memóriacím, ahol a kiiratni kívánt
adategység kezdôdik.
 size  : Az
adategység mérete byte-okban kifejezve.
 count  : A kiiratni kívánt adategységek száma.
 f  :
A file struktúrára mutató pointer.
 Ez
a függvény kiválóan alkalmas tömbök, struktúrák, ill. struktúra tömbök 
 kiiratására. Utóbbira
lásd: 40. sz. példaprogram.
Adategység formátum nélküli beolvasása file-ból
int fread( char *buffer, int size, int count, FILE *f );
 ahol  :
 buffer : Az a memóriacím, ahova az adategységet be
akarjuk olvasni.
 size  : Az
adategység mérete byte-okban kifejezve.
 count  : A beolvasni kívánt adategységek száma.
 f  :
A file struktúrára mutató pointer.
Ez a függvény kiválóan alkalmas tömbök, struktúrák, ill. struktúra tömbök
beolvasására. 
File vége ( End Of File ) vizsgálat
 int feof( FILE *f );
 ahol  :
 f   : A file struktúrára mutató pointer.
A függvény 0 értéket ad vissza, ha nem a file végén vagyunk, ill. nem 0
értéket, ha a file végén vagyunk.
Találat: 2431