Scrivere su file è forse la parte più importante di questo corso, perché si pongono le basi per salvare i propri lavori e quindi iniziare a strutturare programmi di una certa complessità. Abbiamo già accennato alle operazioni di input/output limitandoci a quelle che coinvolgevano la tastiera come dispositivo di input e lo schermo come dispositivo di output. Per poter operare correttamente è necessario includere l'header file <stdio.h> che contiene tutte funzioni per l'input/output, comprese quelle che operano sui file.
In C le operazioni di I/O vengono semplificate attraverso l'uso degli stream, altro non sono che delle astrazioni rappresentative di un file o di un dispositivo fisico, che vengono manipolate attraverso l'uso di puntatori. L'enorme vantaggio di usare gli stream è quello di potersi riferire ad un identificatore senza preoccuparsi di come questo venga implementato; generalmente le operazioni che si compiono su uno stream sono tre, lo si apre, vi si accede (nel senso di operazioni di lettura e scrittura) e lo si chiude. L'altra importante caratteristica è che lo stream è bufferizzato, ovvero viene riservato un buffer per evitare ritardi o interruzioni nella fase di lettura e scrittura, infatti il contenuto del buffer non viene mandato al dispositivo (che si tratti di un dispositivo fisico o di un file non ha importanza) fino a quando non viene svuotato o chiuso.
Gli stream predefiniti nel linguaggio C (che vengono messi a disposizione includendo la <stdio.h>) sono:
stdin, stdout, stderr
Questi stream utilizzano principalmente il testo come metodo di comunicazione I/O, anche se i primi due possono essere usati con i file, con i programmi, con la tastiera, con la consolle e lo schermo, lo stderr può scrivere soltanto su console o sullo schermo. La console è il dispositivo di default per stdout e stderr, mentre per stdin il dispositivo di default è la tastiera.
Linux e l'I/O
Linux (e Unix) permette una serie di operazioni che non fanno parte del linguaggio C, ma del sistema operativo stesso; queste operazioni permettono di gestire l'input o l'output di un programma e di redirigerlo dove meglio si crede.
- >
redirige lo stdout, generalmente stampato a video, in un file; ammettiamo di avere un programma di nome "prog", per redirigere il risultato in un file basta fare, da console:
# prog > risultato.txt - <
redirige il contenuto del file allo stdin; ammettiamo di avere un file di nome "input.txt" e di volerlo passare come input al programma "prog", basta digitare, da console:
# prog < input.txt - | (pipe)
questo simbolo speciale permette di redirigere lo stdout di un programma allo stdin di un altro programma; supponiamo di avere "prog1" che deve mandare il proprio output a "prog2", da console scriveremo:
# prog1 | prog2due esempi pratici in linux sono:# prog | lpr
// manda l'output di "prog" alla stampante# ls -l | more
// visualizza le directory
// una schermata per volta