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 concetto di Stream
Section titled “Il concetto di Stream”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 *.
Stream Predefiniti
Section titled “Stream Predefiniti”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.
Il Buffering
Section titled “Il Buffering”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 (
stdoutestdin) si svuotano o elaborano non appena incontrano il carattere “vai a capo” (\n). - Unbuffered: Lo
stderrnon ha buffer; se c’è un errore grave, deve essere stampato all’istante, prima che il programma crashi.
Aprire e Chiudere i File: fopen e fclose
Section titled “Aprire e Chiudere i File: fopen e fclose”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;}Le modalità di apertura principali
Section titled “Le modalità di apertura principali”"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).
💻 Esercizio Pratico
Section titled “💻 Esercizio Pratico”Riempi il codice sottostante per aprire il file “config.txt” in modalità lettura, controllare eventuali errori, e richiuderlo.