Per leggere un dato da un file binario si usa la funzione fread, che ha gli stessi parametri della funzione fwrite. Il primo parametro è l'indirizzo della variabile su cui scrivere il dato, e gli altri sono gli stessi (il numero di byte in memoria occupati dal dato, il numero 1, e il descrittore di file). Per esempio, per leggere un intero da file e memorizzarlo nella variabile x, si può fare cosí:
fread(&x, sizeof(x), 1, fd);
Questo vale ovviamente per un qualsiasi tipo di dato. Il programma di esempio leggidue.c legge due interi da un file binario e li stampa su schermo.
/*
Legge due interi da un file binario.
*/
#include<stdlib.h>
#include<stdio.h>
int main() {
FILE *fd;
int x, y;
int res;
/* apre il file in lettura */
fd=fopen("test.dat", "r");
if( fd==NULL ) {
perror("Errore in apertura del file");
exit(1);
}
/* lettura primo numero */
res=fread(&x, sizeof(int), 1, fd);
if( res!=1 ) {
perror("Errore in lettura");
exit(1);
}
/* lettura secondo numero */
res=fread(&y, sizeof(int), 1, fd);
if( res!=1 ) {
perror("Errore in lettura");
exit(1);
}
/* chiude il file */
fclose(fd);
/* stampa i due numeri letti */
printf("Ho letto %d e %d\n", x, y);
return 0;
}
La funzione ritorna il valore 1 se la lettura è avvenuta correttamente, e 0 altrimenti (questa è una prima approssimazione, che va bene per come usiamo la funzione per ora).
Si noti che la funzione fread, se riesce a leggere almeno quattro byte da file, riporta che la lettura di un intero è avvenuta correttamente. Quindi non esiste un ``errore di conversione'' come nel caso in cui si legge da un file di testo e si incontra un carattere al posto di una cifra. Infatti, un gruppo di quattro byte corrisponde sempre a un intero. L'unico caso in cui la funzione fread non ritorna 1 è perchè non è stato possibile leggere un numero sufficente di byte per riempire il tipo di dato da leggere. Questo può essere dovuto a un problema hardware, di sistema operativo, oppure al fatto che il file è finito.