Una volta aperto un file con la funzione fopen, possiamo usare due funzioni per accedervi: la fprintf e la fscanf che, per quanto simili printf
e scanf
, operano sullo stream del file aperto da fopen()
; la forma con la quale si presentano le due funzioni di C è la seguente:
int fprintf(FILE *stream, char *formato, argomenti ...);
int fscanf(FILE *stream, char *formato, argomenti ...);
La fprintf, come si può intuire, scrive sullo stream, mentre la fscanf legge dallo stream; entrambe seguono per i parametri, tranne il primo, quello che è già stato detto per printf e scanf e che riportiamo sinteticamente qui sotto per comodità di consultazione.
Formato e argomenti
La stringa formato ha due tipi di argomenti, i caratteri ordinari che vengono copiati nello stream di output, e le specifiche di conversione, contraddistinte dal simbolo percentuale (%
) e da un carattere, che illustriamo di seguito e che specifica il formato con il quale stampare le variabili presenti nella lista di argomenti:
Stringa di controllo | Cosa viene stampato |
---|---|
%d, %i |
Intero decimale |
%f |
Valore in virgola mobile |
%c |
Un carattere |
%s |
Una stringa di caratteri |
%o |
Numero ottale |
%x, %X |
Numero esadecimale |
%u |
Intero senza segno |
%f |
Numero reale (float o double) |
%e, %E |
Formato scientifico |
%% |
Stampa il carattere % |
Naturalmente fprintf
e fscanf
possono lavorare con gli stream predefiniti, stdout - stderr e stdin rispettivamente, come mostrato dall'esempio seguente:
/* stampa un messaggio di errore */
fprintf(stderr, "Impossibile continuare!n");
/* scrive a video un messaggio */
fprintf(stdout, "Operazione completata!n");
/* riceve da tastiera una stringa e la
* salva nella variabile "miastringa" */
fscanf(stdin, "%s", miastringa);
Esistono, inoltre altre quattro funzioni che operano su file scrivendo un carattere per volta, esattamente come fanno la getchar e la putchar per gli stream predefiniti; queste quattro funzioni sono:
int getc(FILE *stream);
int fgetc(FILE *stream);
int putc(char ch, FILE *stream);
int fputc(char ch, FILE *stream);
Una curiosità risiede nel fatto che getc è una macro del preprocessore, mentre fgetc è una funzione di libreria, ma fanno esattamente la stessa cosa.