Filekezelés

Alapfogalmak

File: adatok az operációs rendszerben

Stream: file elérése a C programból

A gyakorlatban mindkét elnevezést használjuk.

Kétféle stream (text, binary).

 

text

Display-n olvasható - nyomtatón nyomtatható

A text file hordozható, de a maximális hordozhatóság érdekében

NE legyen

ˇ        üres file

ˇ        space a sorvége előtt

ˇ        sor sorvége karakter nélkül (EOF előtt)

CSAK a következő karaktereket tartalmazza

ˇ        isprint()

ˇ        \n

ˇ        \t

 

bináris

Ahogy a memóriában van

 

Kapcsolat az operációs rendszerhez (File - Stream összerendelés)

FILE * fopen(const char* s, const char* mode);

FILE * freopen(const char* s, const char* mode, FILE *f);

int fclose (FILE *f);

 

FILE struktúra tartalma:

ˇ        hiba állapot

ˇ        EOF állapot

ˇ        file pozíció

ˇ        file buffer

 

Előre definiált: stdin, stdout, stderr

 

A FILE struktúrát csak könyvtári függvények érik el!

Megnyitási módok

tömören

ˇ        r,w,a (read, write, append)

ˇ        b (binary) - hiánya text

ˇ        + (update)

 

Szigorúan véve a binary mód csak a \n konverzió hiányát jelenti.

A következő táblázat összefoglalja az összes legális kombinációt, és azok értelmezését:

 

 

r

rb

w

wb

a

ab

r+

r+b

rb+

w+

w+b

wb+

a+

a+b

ab+

kell, hogy létezzen

x

 

 

x

 

 

ha létezik, törlődik

 

x

 

 

x

 

olvasható tetszőleges pozícióban

x

 

 

x

x

x

írható tetszőleges pozícióban

 

x

 

x

x

 

csak a végére írhatunk

 

 

x

 

 

x

 

Ahol a táblázatban x van, azok a helyes állítások.

 

A következő ábra összefoglalja a file-művelet közötti állapotváltásokat.

 

 

olvasás (READ)

fgetc

fgets

fread

fscanf

getch

getchar

gets

scanf

ungetch

 

 

 

 

írás (WRITE)

fprints

fputc

fputs

fwrite

printf

putc

putchar

puts

fprintf

vprintf

 

 

 

pozicionálás (POSITION)

fflush

fseek

fsetpos

rewind

 

File átnevezése

int rename(const char *old, const char *new);

File törlése

int remove(const char *filename);

Temporális file-név

char *tmpnam(char *s);

Temporális file

FILE *tmpfile(void)

 

Hibakezelés

 

A hiba detektálható, de nem tudjuk meg, hogy micsoda.

A hiba detektálása a visszatérési értékeken keresztül.

Csak a POSIX szabványban vannak definiálva a hibák pontosan.

Még hibakezelésre használható

ˇ        errno (errno.h)

ˇ        ferror

ˇ        perror

ˇ        strerror (string.h)

ˇ        clearerror

 

File vége jelzés

int feof(FILE *stream);

Vigyázat! Csak akkor lesz TRUE, ha már megkíséreltünk valamilyen file-műveletet a file végén.

Szöveges file kezelés

Karakteres I/O

getchar

getc

fgetc

putchar

putc

fputc

ungetc

Sor I/O

gets

fgets

puts

fputs

FIGYELEM! gets rendkívül veszélyes: senki nem ellenőrzi, ha az inputon több karakter érkezik, mint amennyi elfér a rendelkezésre álló buffer-ben. Használjunk mindig fgets-t.

 

Formátumozott output

 

int printf(const char *format, ...);

int fprintf(FILE *stream, const char *format, ...);

int sprintf(char *s, const char *format, ...);

int vprintf(const char *format, va_list ap);

int vfprintf(FILE *stream, const char *format, va_list ap);

int vsprintf(char *s, const char *format, va_list ap);

 

Formátumozott input

 

int scanf(const char *format, ...);

int fscanf(FILE *stream, const char *format, ...);

int sscanf(char *s, const char *format, ...);

 

scanf - print PRINF NEM SZIMMETRIKUS!

 

scanf visszatérési értéke: a beolvasott adatok száma, EOF, ha az input eleve EOF volt.

 

scanf terminálódik, ha

ˇ        eléri a formátummező végét

ˇ        nincs több input

ˇ        a konverzió sikertelen

 

Az inputnak tételesen illeszkednie kell a formátummezőre, kivéve, ha az whitespace, Ekkor tetszőleges hosszú whitespace-re illeszkedik, azaz addig nem terminálódik, amíg valamilyen nem whitespace karaktert nem olvas.

 

Más a jelentése a % utáni résznek, mint a printf-nél.

Az integer típusok egyeznek.

Lebegőpontos típusoknál más, oka: minden függvényhívásnál a float double-vé konvertálódik

 

Bináris file kezelés

size_t fread(void *ptr, size_t size, size_t nelem, FILE *stream);

size_t fwrite(const void *ptr, size_t size, size_t nelem, FILE *stream);

 

Buffer kezelés

fflush

setbuf

setvbuf

Pozicionálás

Pozíció mihez viszonyítva:

SEEK_SET - file eleje

SEEK_CUR - aktuális pozíció

SEEK_END - file vége

int fseek(FILE *stream, long offset, int mode);

long ftell(FILE *stream);

File méret meghatározása:

long Meret(FILE *f) {fseek(f,0,SEEK_END); return ftell(f)}