Verifica in apertura

Cosa succede se si apre un file che non esiste su disco? Questo può succedere per esempio se si sbaglia a digitare il nome del file: non è detto che sul disco ci sia un file con il nome che è stato passato a fopen.

Esistono poi altri errori che possono verificarsi quando si cerca di accedere a un file. Per il momento, non ci interessano. Quello che conta è il modo in cui il programma può verificare se c'è stato un errore in apertura oppure no.

La regola è semplicemente che, se si è verificato un errore in apertura del file, il valore che viene ritornato da fopen è la costante NULL. Quindi, se dopo aver aperto il file vogliamo verificare se ci sono stati errori, dobbiamo confrontare il valore ritornato da fopen con NULL.

Il seguente programma verifica.c apre un file, e poi verifica se ci sono stati errori. In caso di errore, il valore del descrittore di file è NULL. In questo caso, si stampa un messaggio di errore e si termina l'esecuzione del programma.

/*
  Apre il file, e verifica.
*/

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

int main() {
  FILE *fd;

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

		/* verifica errori in apertura */
  if( fd==NULL ) {
    printf("Si e' verificato un errore in apertura del file\n");
    exit(1);
  }

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

  return 0;
}

Questo programma stampa un messaggio se si è verificato un errore durante l'apertura del file, ossia se non siamo riusciti ad aprire il file. Però non dice quale specifico errore si è verificato. Per fare questo, usiamo la funzione perror, che stampa un messaggio che indica quale specifico errore si è verificato. Questa funzione prende una stringa, che viene stampata prima del messaggio di errore. Il programma perror.c è simile al precedente, ma il messaggio di errore viene stampato con perror.

/*
  Apre il file, e verifica.
*/

#include
#include

int main() {
  FILE *fd;

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

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

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

  return 0;
}