Lettura array con allocazione di memoria

Una variante del programma di lettura di array da file è la seguente: supponiamo che gli elementi dell'array siano allocati su file in ordine, ma che non ci sia un primo elemento che dice quanto è grande l'array. In altre parole, il file contiene il primo elemento, il secondo, ecc, fino all'ultimo elemento e poi il file finisce.

Per un essere umano non è difficile capire quanti elementi ci sono sul file. Se per esempio il file contiene:

-12
3
32
12

Allora è chiaro che il vettore deve essere composto da quattro elementi. Il problema è fare in modo che questo numero venga calcolato dal programma.

Una possibile strategia è la seguente: apriamo il file in lettura, e cominciamo a leggere interi fino alla fine del file. Se ogni volta che leffiamo un intero incrementiamo un contatore, allora alla fine della scansione del file questo contatore contiene il numero di interi che si trovano nel file.

Una volta noto questo numero si può procedere come nel programma precedente: si alloca un vettore di n*sizeof(int) elementi. Ora dobbiamo di nuovo leggere il file dall'inizio, per cui lo chiudiamo e lo riapriamo di nuovo. A questo punto possiamo leggere gli elementi del file uno per volta. Il programma finale leggiarrayeof.c è qui sotto.

/*
  Legge un array da file, fino all'end-of-file.
*/

#include<stdlib.h>
#include<stdio.h>

int main() {
  int n;
  int *vett;
  FILE *fd;
  int res;
  int i;

		/* apre il file */
  fd=fopen("array.txt", "r"); 


		/* verifica errori in apertura */
  if( fd==NULL ) {
    perror("Errore in apertura del file");
    exit(1);
  }


		/* legge il numero di elementi del vettore */
  n=0;
  while(1) {
    res=fscanf(fd, "%d\n", &i);
    if( res==EOF )
      break;
    else
      n++;
  }

  printf("Il file contiene %d elementi\n", n);


		/* chiude il file */
  fclose(fd);


		/* riapre il file */
  fd=fopen("array.txt", "r");

  if( fd==NULL ) {
    perror("Errore in apertura del file");
    exit(1);
  }


		/* alloca il vettore */
  vett=malloc(n*sizeof(int));


		/* legge il vettore */
  for(i=0; i<=n-1; i++)
    fscanf(fd, "%d\n", &vett[i]);


		/* chiude il file */
  fclose(fd);


		/* stampa l'array */
  for(i=0; i<=n-1; i++)
    printf("%d\n", vett[i]);

  return 0;
}

Questo programma non controlla se la operazione di lettura fallisce a causa della fine del file oppure a causa di caratteri non interpretabili come interi. Modificare il programma in modo da renderlo robusto.