Il C non complica la gestione del testo. Elimina gli strati di astrazione e ti lascia con la meccanica grezza. Se hai osservato la documentazione del C, probabilmente avrai notato che tutte le funzioni di input/output di testo risiedono all’interno della libreria stdio. Questo sta per input/output standard. È il fondamento del modo in cui i programmi C comunicano con il mondo esterno.
La maggior parte dei principianti inizia con stdin e stdout. Questi sono flussi standard. Rappresentano dove un programma ottiene i dati e dove invia i risultati. Se la tua applicazione necessita solo di una fonte di input e di un sink per l’output, non hai bisogno di una gestione dei file complessa. Devi semplicemente convogliare i dati attraverso la riga di comando.
I sei flussi fondamentali
L’intestazione stdio fornisce sei comandi specifici per interagire con questi flussi. Sono semplici. Diretto.
- printf : scrive il testo formattato su stdout.
- scanf : legge i dati formattati da stdin.
- puts : visualizza una stringa sullo schermo.
- gets : legge una riga di testo dalla tastiera.
- putc : scrive un singolo carattere su stdout.
- getc o getchar : legge un singolo carattere da stdin.
Perché usarli? Perché puoi reindirizzarli. È qui che C brilla. Non è necessario modificare il codice per leggere da un file anziché da una tastiera. Basta cambiare il comando che digiti nel terminale.
Contare i caratteri in modo semplice
Vediamo un esempio pratico. Immagina di volere un programma che conti il totale dei caratteri in un input di testo. Ecco il codice:
Questo codice attende l’input. Scrivi delle righe. Quando hai finito, premi CTRL-D. Questo segnala la fine del file (eof ). La funzione gets restituisce zero quando raggiunge eof, interrompendo il ciclo. Il conteggio finale viene stampato sullo schermo.
Ma ecco il trucco. Non era necessario modificare il codice per contare i caratteri in un file. Hai appena aggiunto una piccola istruzione alla shell.
Reindirizzamento di input e output
Se hai compilato questo programma in un eseguibile chiamato xxx, puoi alimentarlo con un file.
“bash.”
xxx < nomefile
Questo è lo stesso risultato. cat scarica il file sullo standard output. La pipe lo invia al tuo programma.
Puoi anche reindirizzare l’output. Invece di vedere il conteggio sullo schermo, puoi salvarlo.
“bash.”
xxx
“`
Ora xxx legge da filename e scrive il risultato in un nuovo file di testo denominato out. Questo è potente. Ti consente di concatenare strumenti insieme senza scrivere codice aggiuntivo per gestire i puntatori ai file.
Quando gli streaming non bastano
A volte il reindirizzamento non è sufficiente. Forse devi aprire più file contemporaneamente. Forse stai creando un editor di testo che salva i file di configurazione. Forse devi verificare se hai raggiunto la fine di un file senza bloccarsi.
In questi casi, sono necessarie funzioni di file dirette. Anche questi sono in stdio, ma operano su puntatori di file anziché su flussi standard.
- fopen : apre un file in lettura o scrittura.
- fclose : chiude il file quando hai finito.
- feof : controlla se hai raggiunto la fine del file.
- fprintf : scrive i dati formattati in un file specifico.
- fscanf : legge i dati formattati da un file specifico.
- fputs : scrive una stringa in un file.
- fgets : legge una riga da un file.
- fputc : scrive un carattere in un file.
- fgetc : Legge un carattere da un file.
Queste funzioni ti danno più controllo. Puoi gestire più flussi contemporaneamente. Puoi decidere esattamente quale file riceve quali dati.
Quale percorso prendi? La semplicità del reindirizzamento stdin o il controllo dei puntatori diretti ai file? Dipende da cosa stai costruendo. Per gli script rapidi, il reindirizzamento è fondamentale. Per applicazioni complesse, avrai bisogno delle funzioni file.
Non esiste una risposta perfetta. Solo compromessi.





















