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)}