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.