Ulaz i izlaz (C)
#fax #cs/prog/c [deo jezika C]
Sve funkcije su u zaglavlju <stdio.h>
Standardni tokovi
Fajlovi standardnog ulaza, izlaza i izlaza za greške pri pokretanju programa:
./prog < infile
./prog > outfile
./prog 2> errorfile
Ulaz i izlaz pojedinačnih karaktera
int getchar(void); // vraća po 1 karakter sa ulaza, EOF (=-1) na kraju ulaza
int putchar(int c); // ispisuje jedan karakter na standardni izlaz i vraća taj karakter ili EOF ako je došlo do grške
Linijski ulaz i izlaz
char* gets(char* s); // !!! ne gledajući na dužinu niske !!! upisuje u s liniju sa ulaza do EOF ili '\n', umesto kojih stavi '\0', vraća s ili NULL ako nije uspelo (U slučaju greške ne menja s)
int puts(const char* s); // ispisuje nisku s na standardni izlaz, na kraju umesto '\0' ispisuje '\n'. Ako nije uspelo vraća EOF, inače drugu vrednost
Formatirani izlaz — printf
int printf(const char *format, ...);
— vraća broj odštampanih karaktera.
format
niska sadrži obične karaktere za štampanje kao i specifikacije konverzija za argumente ...
; jednom argumentu odgovara zapis redom:
%
— (obavezan)-
— levo poravnanje- broj
— najmanja dužina polja za argument .
- broj
— niske: najmanji broj karaktera
pokretan zarez: broj decimala posle tačke
celi: najmanji broj cifara
ili*
— preciznost u odvojenom argumentu tipaint
(primer dole) - modifikator
- karakter konverzije (obavezan)
Karakteri konverzije:
Modifikatori:
h
—short
—%hd
l
—long
—%ld
L
—long double
ilong long
—Lf
iLd
! float
se implicitno konvertuje u double
*
- argument:
pritntf("%.*s", max, s); // odštampa najviše max karaktera niske s
Formatirani ulaz — scanf
int scanf(const char *format, ...);
— vraća broj uspešnih dodeljivanja, EOF
u slučaju kraja ulaza.
format
niska sadrži obične karaktere, koje se ignorišu, razmake za ignorisanje razmaka na ulazu pri korišćenju %c
, kao i specifikacije konverzija za argumente ...
, argumente su uvek pokazivači; jednom argumentu odgovara zapis redom:
%
— (obavezan)*
— čitanje bez dodeljivanja; bez argumenta- broj
— dužina za čitanje - modifikator
- karakter konverzije (obavezan)
Karakteri konverzije:
Modifikatori se podudaraju sa printf
.
Ulaz iz niske i izlaz u nisku
int sprintf(char* out_string, const char *format, ...);
— u nisku out_string
upisuje isto što bi bilo ispisano printf
-om na standardni izlaz.
int sscanf(char* in_string, const char *format, ...);
— iz niske in_string
čita tako kako bi scanf
pročitao sa standardnog ulaza.
Ulaz iz datoteka i izlaz u datoteke
Pristupanje datoteci
FILE* fopen(const char* filename, const char* mode);
— vraća pokazivač na strukturu FILE
, u koja sadrži informacije o fajlu, u slučaju greške vraća NULL
.
filename
— niska koja sadrži ime datoteke.
mode
— način otvaranja datoteke:
"r"
— čitanje"w"
— pisanje (brišu se prethodne podatke)"a"
— dopisivanje (pisanje posle već postojećih podataka)- dodavanjem
'+'
u nisku omogućava se i čitanje i pisanje - dodavanjem
'b'
u nisku datoteka se otvara kao binarna.
Treba uvek proveravati da li je dobro otvorio fajl, tj. da li pokazivač nije NULL
.
int fclose(FILE* fp);
— zatvaranje fajla; treba uvek zatvarati fajl za obezbeđivanje podataka.
FILE* stdin; // datoteka standardnog ulaza
FILE* stdout; // datoteka standardnog izlaza
FILE* stderr; // datoteka standardnog izlaza za greške
Ulaz i izlaz pojedinačnih karaktera
int getc(FILE* fp); // vraća po 1 karakter iz fp, EOF (=-1) na kraju datoteke
int putc(int c, FILE* fp); // upisuje jedan karakter u datoteku i vraća taj karakter ili EOF ako je došlo do grške
int unget(int c, FILE* fp); // "vraća" karakter c u datoteku (ne menja datoteku), sledeći getc će njega pročitati
Provera grešaka i kraja datoteke
int feof(FILE* fp); // vraća nenulu ako je došlo do kraja datoteke
int ferror(FILE* fp); // vraća ne-nulu ako je došlo do greške sa datotekom
Linijski ulaz i izlaz
char* fgets(char* s, int n, FILE* fp); // upisuje u s liniju iz datoteke do EOF ili '\n' dužine najviše (n-1), na krraju stavi '\0', vraća s ili NULL ako nije uspelo (U slučaju greške ne menja s)
int fputs(const char* s, FILE* fp); // upisuje nisku s u datoteku, na kraju umesto '\0' ispisuje '\n'. Ako nije uspelo vraća EOF, inače drugu vrednost
Alokacija prostora za ulaznu liniju
size_t getline(char** paloc_linija, int* n, FILE* fp);
paloc_linija
— pokazivač na pokazivač koji pokazuje na početak niske (alociranog bloka), u prvi poziv pokazuje na NULL
,
n
— pokazivač na broj — za koliko karaktera je alocirano memorije.
getline
čita liniju iz datoteke i upisuje u nisku *paloc_linija
ako je moguće ili (re)alocira memoriju i upisuje.
Korišćenje:
char *linija = NULL;
int n = 0;
getline(&linija, &n, file); // čitanje prve linije
...
getline(&linija, &n, file); // čitanje druge linije
...
free(linija); // !!!
Formatirani ulaz i izlaz
int fprintf(FILE* fp, const char *format, ...);
int fscanf(FILE* fp, const char *format, ...);