Storia della domanda:
Lavorare con i file nel linguaggio C è un'abilità fondamentale, emersa già nelle prime implementazioni del linguaggio. La libreria standard C (stdio.h) fornisce funzioni universali per lavorare con i flussi di input-output, rendendo i programmi portabili tra i OS.
Problema:
Spesso i programmatori principianti commettono errori nel lavoro con i flussi di file: non controllano il risultato dell'apertura dei file, gestiscono in modo errato la memoria per il buffering, non gestiscono gli errori di lettura o scrittura. Gli errori nella chiusura dei file portano a perdite di risorse, mentre un lavoro non corretto con i buffer porta alla perdita di dati.
Soluzione:
Per lavorare correttamente con i file è necessario sempre:
fopen;fread, fwrite, fscanf, fprintf per lettura/scrittura;fclose.Esempio di codice:
#include <stdio.h> int main() { FILE *fp = fopen("example.txt", "w"); if (!fp) { perror("Errore nell'aprire il file"); return 1; } fprintf(fp, "Hello, world! "); fclose(fp); fp = fopen("example.txt", "r"); if (!fp) { perror("Errore nell'aprire il file per la lettura"); return 1; } char buffer[100]; while (fgets(buffer, sizeof(buffer), fp)) { printf("%s", buffer); } fclose(fp); return 0; }
Caratteristiche chiave:
È possibile chiudere un file usando fclose più volte di seguito?
No, la chiusura duplicata di un flusso di file porta a un comportamento indefinito (undefined behavior). Dopo fclose, il descrittore diventa non valido.
Cosa restituirà la funzione fread se raggiunge la fine del file?
fread restituisce il numero di elementi letti con successo. Se si raggiunge la fine del file, il numero restituito potrebbe essere inferiore a quello atteso. È sempre necessario controllare feof e ferror per la diagnosi.
È possibile utilizzare lo stesso flusso di file per scrivere e leggere simultaneamente?
È possibile, se il file è aperto in modalità "r+" o "w+", tuttavia, è necessario, prima di cambiare direzione (scrittura/lettura), effettuare una chiamata a fflush o un'altra operazione di spostamento della posizione del file (fseek). Altrimenti, il comportamento non è definito.
FILE * dopo fclose.fflush, il flusso non è stato chiuso).Un sviluppatore scriveva dati in un file di log senza controllare il valore restituito da fopen. Dopo l'esaurimento dei descrittori, il file non veniva più aperto — i messaggi di log andavano persi.
Vantaggi:
Svantaggi:
In un'altra versione del codice venivano sempre controllati tutti i valori restituiti (fopen, fwrite, fclose). In caso di errore, veniva stampato un messaggio diagnostico dettagliato tramite perror, e il programma terminava correttamente, liberando tutte le risorse.
Vantaggi:
Svantaggi: