Chiudere un File in Linguaggio C
- La funzione
fcloseè utilizzata per chiudere un file aperto in C. - Chiudere un file è importante per liberare le risorse di sistema e garantire che tutti i dati vengano salvati correttamente.
- La funzione
fcloserichiede un puntatore a un oggettoFILEcome parametro. - La funzione restituisce
0se la chiusura del file è avvenuta con successo, oppureEOFin caso di errore. - È buona pratica chiudere esplicitamente i file non più necessari, anche se il sistema operativo li chiude automaticamente alla terminazione del programma.
Chiudere un file
Nella lezione precedente abbiamo visto come aprire un file in linguaggio C utilizzando la funzione fopen() specificando sia il percorso del file che la modalità di apertura. La funzione fopen() restituisce un puntatore a un oggetto di tipo FILE, che rappresenta il file aperto e viene utilizzato per eseguire operazioni di lettura o scrittura sul file che vedremo in seguito.
Dopo aver completato le operazioni di lettura o scrittura su un file, è importante chiuderlo correttamente per liberare le risorse di sistema associate al file e garantire che tutti i dati vengano salvati correttamente. In linguaggio C, la funzione utilizzata per chiudere un file è fclose().
L'operazione di chiusura è importante per una serie di motivi:
-
Se il file è aperto in scrittura, la chiusura del file assicura che tutti i dati scritti vengano effettivamente salvati sul disco.
Infatti, le operazioni di scrittura possono essere memorizzate in un buffer temporaneo dal sistema operativo e non essere immediatamente scritte sul file fisico. La chiamata a
fclose()forza la scrittura di questi dati sul disco. -
Chiudere un file libera le risorse di sistema associate al file.
Infatti, ogni file aperto consuma risorse di sistema. Un sistema operativo associa ad ogni file aperto una certa quantità di memoria e altre risorse indicizzate da un cosiddetto file descriptor o descrittore di file. Per evitare che un processo possa saturare le risorse di sistema, tutti i sistemi operativi impongono un limite massimo al numero di file che un processo può tenere aperti contemporaneamente. Chiudere i file non più necessari aiuta a mantenere il numero di file aperti entro questi limiti. Questo è molto importante soprattutto in applicazioni che aprono molti file o che operano su file di grandi dimensioni.
Bisogna anche tener presente che non chiudere un file non è un errore grave di per se. Infatti, quando un programma termina, il sistema operativo chiude automaticamente tutti i file aperti dal programma. Tuttavia, è una buona pratica di programmazione chiudere esplicitamente i file non più necessari.
Chiudere sempre esplicitamente i file non più necessari
Anche se il sistema operativo chiude automaticamente i file aperti alla terminazione del programma, è una buona pratica di programmazione chiudere esplicitamente i file non più necessari utilizzando la funzione fclose().
La funzione fclose
Tornando alla funzione fclose(), la sua sintassi è la seguente:
int fclose(FILE *stream);
Essa richiede come parametro un puntatore a un oggetto di tipo FILE, che rappresenta il file da chiudere. La funzione restituisce un valore intero: 0 se la chiusura del file è avvenuta con successo, oppure EOF (End Of File) in caso di errore.
EOF è una macro (una costante) definita nel file di intestazione <stdio.h>, che rappresenta un valore intero negativo utilizzato per indicare la fine di un file o un errore nelle operazioni di input/output.
Per chiarire l'uso della funzione fclose(), consideriamo il seguente schema di programma che apre un file, chiamato esempio.dat, in modalità lettura, controlla che sia stato aperto correttamente, e poi dopo aver eseguito delle operazioni di lettura (non mostrate qui), chiude il file prima di terminare:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
int result;
// Aprire il file in modalità lettura
file = fopen("esempio.dat", "r");
if (file == NULL) {
printf("Errore nell'apertura del file");
return EXIT_FAILURE;
}
// Operazioni di lettura sul file
// ...
// Chiudere il file
result = fclose(file);
if (result == EOF) {
printf("Errore nella chiusura del file");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Le operazioni di apertura del file possono essere riassunte anche con la seguente riga di codice:
file = fopen("esempio.dat", "r");
Anzi, possiamo racchiudere il tutto nella condizione dell'istruzione if, come mostrato di seguito:
if ((file = fopen("esempio.dat", "r")) == NULL) {
printf("Errore nell'apertura del file");
return EXIT_FAILURE;
}
In questo esempio, dopo aver aperto il file e verificato che l'apertura sia avvenuta con successo, eseguiamo le operazioni di lettura (non mostrate qui) e infine chiudiamo il file utilizzando fclose(). Se la chiusura del file fallisce, viene stampato un messaggio di errore.