Una volta che si è aperto un file con la funzione fopen, possiamo usare due funzioni per accedervi, queste sono la fprintf e la fscanf che, per quanto simili alla printf ed alla scanf, operano sullo stream del file aperto da fopen(); la forma con la quale si presentano le due funzioni è 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 nella lezione sette 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 la fprintf e la fscanf possono scrivere negli 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);
In realtà una curiosità risiede nel fatto che getc è una macro del preprocessore, mentre fgetc è una funzione di libreria, ma fanno esattamente la stessa cosa.