Leggere da un file binario

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.