Lettura di un array da file

Usando le funzioni di apertura, lettura e scrittura da file, e avendo visto come si scrive/legge in sequenza, possiamo ora vedere operazioni più complesse. Supponiamo quindi di avere un file di nome array.txt che viene usato per memorizzare un array.

Più precisamente, il file contiene una sequenza di numeri interi. Il primo numero rappresenta la dimensione dell'array, ossia il numero di elementi che contiene. Questi elementi sono memorizzati su file di seguito, in sequenza.

Vogliamo un programma che legga un file di questo genere, e memorizzi i dati che contiene in un vettore. Facciamo l'ipotesi che ci siano al massimo 100 elementi. Questo permette di usare un vettore dichiarato staticamente per contentere i dati scritti su file.

Dopo l'operazione di apertura del file, con controllo errori, quello che serve è leggere il primo numero intero scritto su file, che è il numero di elementi successivi del file. Per memorizzare questo numero, dichiariamo una variabile intera n. Facciamo quindi una operazione di lettura di intero da file:

  fscanf(fd, "%d", &n);

A questo punto sappiamo che sul file ci sono altri n interi, che vanno letti da file e messi in ordine in un vettore. Dichiariamo una variabile vett come vettore di 100 interi. Per leggere gli elementi del vettore da file, facciamo un ciclo, in cui leggiamo un elemento a ogni iterazione.

    for(i=0; i<=n-1; i++)
      fscanf(fd, "%d", &vett[i]);

Il problema è risolto. Il vettore contiene ora gli elementi memorizzati sul file, e la variabile n indica quanti interi sono stati effettivamente letti, ossia quanti elementi del vettore contengono effettivamente dei valori che sono stati letti da file (gli eltri elementi del vettori non sono stati inizializzati o letti, quindi non contengono valori significativi).

Il programma completo è leggiarray.c, che contiene anche un controllo aggiuntivo se n è effettivamente minore di 100. Dopo aver letto il vettore, stampa i suoi elementi su schermo.

/*
  Legge un array da file.
*/

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

int main() {
  int n;
  int vett[100];
  FILE *fd;
  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 */
  fscanf(fd, "%d", &n);

  
		/* legge l'array */
  if(n>=100) 
    printf("Troppi elementi da leggere\n");
  else
    for(i=0; i<=n-1; i++)
      fscanf(fd, "%d", &vett[i]);


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

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

  return 0;
}