Skip to content

Stream e Gestione dei File

L’Input/Output (I/O) è il modo in cui i programmi comunicano con il mondo esterno (tastiera, schermo, dischi di memoria). Senza l’I/O, i programmi sarebbero delle scatole chiuse del tutto inutili.

Il C non comunica direttamente con l’hardware dei dispositivi. Utilizza invece un’astrazione chiamata stream (flusso). Uno stream è una sequenza ordinata di dati. Tastiere, monitor e file su disco vengono tutti trattati dal C come se fossero dei semplici “tubi” dove passano dei byte.

La libreria <stdio.h> usa il tipo opaco FILE per rappresentare gli stream. I programmatori manipolano questi oggetti usando un puntatore: FILE *.

Quando avvii un programma, il sistema operativo ti regala già tre stream aperti:

  • stdin (Standard Input): Solitamente collegato alla tastiera. Da qui si legge.
  • stdout (Standard Output): Solitamente collegato allo schermo del terminale.
  • stderr (Standard Error): Un secondo canale verso lo schermo, usato specificamente per i messaggi di errore diagnostici.

L’accesso all’hardware (come leggere da un disco) è lentissimo rispetto alla CPU. Per risolvere il problema, gli stream usano un Buffer (un blocco di memoria temporanea).


  • Fully buffered: I file su disco vengono letti/scritti “a blocchi”. I dati si accumulano nel buffer prima di essere scritti fisicamente sul disco.
  • Line buffered: Gli stream interattivi (stdout e stdin) si svuotano o elaborano non appena incontrano il carattere “vai a capo” (\n).
  • Unbuffered: Lo stderr non ha buffer; se c’è un errore grave, deve essere stampato all’istante, prima che il programma crashi.

Per leggere o scrivere un file su disco, devi prima aprirlo usando fopen, specificando la modalità di accesso (Mode string).

#include <stdio.h>
#include <stdlib.h>
int main(void) {
// "r" sta per "read" (lettura). Il file deve già esistere.
FILE *file = fopen("documento.txt", "r");
// Controlla sempre se c'è stato un errore!
if (file == NULL) {
fputs("Impossibile aprire il file!\n", stderr);
return EXIT_FAILURE;
}
// ... leggi il file ...
// Chiudere il file è obbligatorio per liberare le risorse
if (fclose(file) == EOF) {
fputs("Errore durante la chiusura.\n", stderr);
}
return EXIT_SUCCESS;
}
  • "r": Sola lettura.
  • "w": Sola scrittura. Attenzione: se il file esiste già, il suo contenuto precedente verrà cancellato (troncato a 0).
  • "a": Append. Scrive alla fine del file, senza cancellare i dati precedenti.
  • Aggiungendo una "b" (es. "rb" o "wb"), specifichi che il file è Binario (foto, audio, dati crudi) e non di Testo (codice, html).

Riempi il codice sottostante per aprire il file “config.txt” in modalità lettura, controllare eventuali errori, e richiuderlo.