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: 2321