Lettura di un file

La funzione fopen serve a dire che vogliamo leggere dati da un file, ma non fa nessuna lettura. Per leggere da file si usa la funzione fscanf. Questa funzione è molto simile alla funzione di input da tastiera scanf, ma legge da file. Il suo primo argomento è un descrittore di file, e indica da quale file vogliamo leggere.

Per esempio, per leggere un intero da tastiera usiamo una istruzione del tipo:

  scanf("%d", &x);

dove x è una variabile intera. Per leggere da file, usiamo una istruzione simile, in cui al posto di scanf mettiamo fscanf, che ha un argomento iniziale aggiuntivo, che è il descrittore del file da cui vogliamo leggere:

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

Il descrittore di file fd deve essere di tipo FILE *, e deve essere il valore che è stato ritornato dalla funzione fopen. Quindi, per leggere un intero da file, occorre:

  1. aprire il file: questo ritorna un descrittore di file che va memorizzato in una variabile
  2. usare fscanf per leggere un intero dal file identificato dal descrittore di file
  3. chiudere il file

Il seguente programma intero.c segue questo metodo per leggere un numero intero da un file che si chiama "intero.txt".

/*
  Legge un intero da file.
*/

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

int main() {
  FILE *fd;
  int x;


		/* apre il file, legge il numero, chiude */

  fd=fopen("intero.txt", "r");

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

  fclose(fd);


		/* stampa il numero */

  printf("Il numero letto da file e' %d\n", x);

  return 0;
}

Questo programma non fa nessuna verifica che il file sia stato aperto correttamente. Per effettuare queta verifica, basta controllare che il descrittore di file ritornato da fopen sia diverso da NULL. Il programma interover.c fa questa verifica.

Una considerazione finale: una volta letto un valore da file, questo valore rimane ovviamente memorizzato nella variabile anche dopo che il file è stato chiuso. Nell'esempio di sopra, una volta letto il numero x si può anche chiudere il file, e il valore nella variabile x rimane inalterato (fino a che non viene esplicitamente riassegnato).