Linguaggio C - stdio.h (libreria standard di I/O)

La libreria standard di I/O consente di effettuare operazioni di lettura/scrittura su dispositivi logici e fisici, come files, linee seriali, e periferiche in genere. Le periferiche su cui e' possibile effettuare I/O sono dipendenti dal sistema operativo in uso.
I sistemi operativi Unix-like (per es. Linux), mettono a disposizione le periferiche (devices) nella directory /dev che cosi' vengono viste come normali files appartenenti al file system, delegando al kernel l'interazione con il device. In questo modo le periferiche possono essere trattate con le normali operazioni di I/O utilizzando la libreria standard stdio.h come se fossero dei files tradizionali. Cosi', ad esempio, e' possibile aprire il joystick in lettura (/dev/js0 si riferisce al primo joystick) e leggere i dati in input per sapere se e' stato premuto o rilasciato un pulsante o per conoscere l'assetto dall'asta. Analogamente e' possibile aprire la scheda audio in lettura (/dev/dsp) per la registrazione di un file wav o in scrittura (/dev/dsp) per la riproduzione di un file wav.
All'interno del file system (e quindi non solo all'interno della directory /dev) e' possibile creare i nomi dei devices tramite il comando mknod.
Questo comando permette di creare degli special file di tipo block o character (a seconda che la periferica supporti la scrittura a blocchi), definendo un major (device) number ed un minor (device) number.
L'associazione tra il nome del device inserito nel file system e le routine di gestione all'interno del kernel, avviene proprio in base alla tripla definita con mknod e cioe': tipo di special file (block o character), major number, minor number.
I block device possono accedere alle informazioni tramite un indirizzo di blocco (es: unita' dischi) e sono bufferizzati; mentre le periferiche a carattere (es: mouse) non dispongono di buffer.

Nel seguito, per quanto detto sopra, si fara' riferimento alle operazioni di I/O effettuate su files estendendo queste operazioni anche alle periferiche, purche' sia le periferiche che le operazioni siano gestite correttamente dal sistema operativo.

Per potere effettuare qualsiasi operazione di I/O su file (es: lettura, scrittura, posizionamento, ...) e' necessario aprire il file al trattamento dei dati. Una volta terminate le operazioni di I/O e' necessario chiudere il file precedentemente aperto. Tipicamente questa operazione avviene al termine del programma, oppure al termine "logico" di macro-operazione (es: salvataggio di dati su un file: apro il file, scrivo le informazioni, chiudo il file).

L'apertura di un file ritorna un valore di tipo puntatore a FILE (FILE e' una struttura definita in stdio.h) e costituisce lo stream che deve essere passato come argomento nelle funzioni di I/O da chiamare successivamente.
L'apertura di un file ritorna il valore NULL in caso di fallimento.

Ogni programma C ha a disposizione 3 file aperti:
o stdin Definisce il flusso di input dei dati.
Tipicamente il flusso di input proviene dalla tastiera, ma puo' anche provenire da un file rediretto in input con il carattere di redirezione <, oppure puo' provenire dall'output sullo stdout di un altro programma e collegato in pipe con il carattere | (es: ls | more), oppure puo' essere presente nello script di esecuzione se l'input del programma viene opportunamente rediretto con i caratteri << oppure con <<-
o stdout Definisce il flusso di output dei dati.
Tipicamente i dati in output su stdout vengono emessi sullo schermo del terminale, del PC, o nella finestra di esecuzione dell'applicazione.
In alternativa, l'output del programma puo' costituire l'input di un altro programma collegato tramite pipe |, oppure puo' essere rediretto su un file tramite > (sovrascrittura dei dati) oppure >> (append dell'output).
o stderr Definisce il flusso di output dei messaggi di errore.
Puo' essere lo schermo del terminale, del PC, o della finestra di dove sta' girando l'applicazione.
Con i sistemi operativi MS-DOS (e Windows) non e' possibile alcuna redirezione.
Con i sitemi Unix-like (es. Linux), e' possibile redirigere lo stderr su file con 2> o immetterlo sullo stdout con 2>&1

Per utilizzare la libreria standard di I/O e' necessario includere l'header stdio.h nel file sorgente:

#include <stdio.h>

o fopen(), fdopen(), freopen()
o popen(), pclose()
o tmpfile()
o fclose()
o setbuf(), setbuffer(), setlinebuf(), setvbuf()
o clearerr(), feof(), ferror(), fileno()
o fseek(), rewind(), ftell(), fgetpos(), fsetpos()
o fflush()
o fgetc(), getc(), getchar(), ungetc()
o fputc(), putc(), putchar()
o fgets(), gets()
o fputs(), puts()
o scanf() fscanf(), sscanf(), vscanf(), vfscanf(), vsscanf()
o printf(), fprintf(), sprintf(), snprintf(), vprintf(), vfprintf(), vsprinf(). vsnprintf()
o fread()
o fwrite()


Indice-C Indice linguaggio C
Indice librerie Indice librerie C
At Home Umberto Zappi Home Page