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
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!
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 |
int
rename(const char *old, const char *new);
int
remove(const char *filename);
char
*tmpnam(char *s);
FILE
*tmpfile(void)
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
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.
getchar
getc
fgetc
putchar
putc
fputc
ungetc
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.
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);
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
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);
fflush
setbuf
setvbuf
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)}