01. Standard I/O - stdio.h
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 è possibile effettuare I/O sono dipendenti dal sistema operativo in uso.
L'apertura di un file ritorna un valore di tipo FILE * (FILE è 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 all'avvio:
stdin: Definisce il flusso di input dei dati. Tipicamente il flusso di input proviene dalla tastiera, ma può anche provenire da un file rediretto in input con il carattere di redirezione <, oppure puo' provenire dallo stdout di un altro programma e collegato in pipe con il carattere | (es: dir | more).
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 può 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).
stderr: Definisce il flusso di output dei messaggi di errore. Può essere lo schermo del terminale, del PC, o della finestra di dove è in esecuzione l'applicazione. E' possibile redirigere lo stderr su file con 2> o immetterlo sullo stdout con 2>&1.
Per utilizzare la libreria standard di I/O è necessario includere l'header stdio.h nel file sorgente:
#include <stdio.h>
Le funzioni della libreria
fopen(), fdopen(), freopen()
popen(), pclose()
tmpfile()
fclose()
setbuf(), setbuffer(), setlinebuf(), setvbuf()
clearerr(), feof(), ferror(), fileno()
fseek(), rewind(), ftell(), fgetpos(), fsetpos()
fflush()
fgetc(), getc(), getchar(), ungetc()
fputc(), putc(), putchar()
fgets(), gets()
fputs(), puts()
scanf() fscanf(), sscanf(), vscanf(), vfscanf(), vsscanf()
printf(), fprintf(), sprintf(), snprintf(), vprintf(), vfprintf(), vsprinf(). vsnprintf()
fread()
fwrite()
Descrizione di alcune funzioni di uso comune
fopen()
Prototipo:
FILE *fopen(const char *path, const char *mode);
Parametri in ingresso:
const char *path: indirizzo del file da aprire.
const char *mode: sequenza di caratteri che identifica la modalità di apertura.
Valore di ritorno:
FILE *: ritorna un puntatore ad una struttura di tipo FILE in caso di successo, altrimenti NULL.
Descrizione:
Apre un file identificato dal parametro path con la modalità descritta da mode e vi associa una struttura descrittiva di tipo FILE. In caso di errore, la variabile errno viene impostata a un codice identificativo dell'errore.
In base alla modalità di apertura cambia anche la posizione da cui inizia la lettura o la scrittura nel file.
Il parametro mode può assumere i seguenti valori:
"r": il file è aperto in sola lettura. La posizione è impostata all'inizio del file. Restituisce un errore nel caso in cui il file non esista.
"r+": il file viene aperto in lettura/scrittura. La posizione è impostata all'inizio del file. Restituisce un errore nel caso in cui il file non esista.
"w": il file viene aperto in scrittura. La posizione è impostata all'inizio del file. Se il file non esiste, viene creato; se invece il file esiste, ne viene cancellato il contenuto.
"w+": il file viene aperto in lettura/scrittura. La posizione è impostata all'inizio del file. Se il file non esiste, viene creato; se invece il file esiste, ne viene cancellato il contenuto.
"a": il file viene aperto in scrittura (modalità append, cioè aggiunta). La posizione è impostata alla fine del file. Se il file non esiste, viene creato; se invece il file esiste, il contenuto viene conservato inalterato ed i nuovi dati scritti vengono aggiunti dopo quelli preesistenti.
"a+": il file viene aperto in lettura/scrittura (modalità append, cioè aggiunta). La posizione di lettura è impostata all'inizio del file, mentre la scrittura è permessa solo alla fine del file. Se il file non esiste, viene creato; se invece il file esiste, il contenuto viene conservato inalterato ed i nuovi dati scritti vengono aggiunti dopo quelli preesistenti.
Aggiungere il carattere b al parametro mode apre i file in modalità binaria, altrimenti essi vengono aperti in modalità testuale. Questo non ha alcun effetto sui sistemi compatibili POSIX (ad esempio GNU/LINUX), mentre invece è importante nei sistemi non-POSIX, come Microsoft Windows, in cui i caratteri di carriage return (codice ASCII 0x0D) vengono trasformati in carriage return + line feed (codici ASCII 0x0D + 0x0A) quando vengono scritti in un file in modalità testo.
Quando si aprono file in modalità lettura/scrittura, lo standard prevede che ogni volta che si passa da un'operazione di scrittura a una di lettura o viceversa, è necessario chiamare la funzione fflush() oppure fseek() per poter svuotare i buffer prima del cambio di modalità.
fprintf()
Prototipo:
int fprintf(FILE *stream, const char *format, ...);
Parametri in ingresso:
FILE *stream: indirizzo del file da aprire.
const char *format: sequenza di caratteri che identifica la modalità di apertura.
Valore di ritorno:
int: ritorna il numero di caratteri scritti, oppure un valore negativo in caso di errore
Descrizione:
La funzione fprintf() scrive su stream gli argomenti passati, eseguendo le opportune conversioni sotto il controllo della stringa di formattazione format.
La stringa di formattazione format puo' contenere sia caratteri ordinari che direttive di conversione.
I caratteri ordinari contenuti in format vengono copiati direttamente sullo stdout, mentre le direttive di conversione specificano come devono essere trattati gli argomenti che seguono.
Il primo argomento da trattare e' quello immediatamente successivo alla stringa di formattazione format.
Ogni volta che un argomento e' stato trattato, l'esame passa all'argomento successivo. Pertanto ciascun argomento viene impiegato una e una sola volta, dopodiche' viene preso in considerazione l'argomento successivo.
Ogni direttiva di conversione inizia con il carattere % e termina con uno dei caratteri d, i, o, x, X, u, c, s, f, e, E, g, E, p, n, %.
Tra il carattere di inizio % e il carattere di conversione possono essere specificati dei flag (in ordine qualsiasi), l'ampiezza, la precisione ed un modificatore.
Di seguito, per ciascuno dei caratteri di conversione ammessi, è riportato il significato.
d, i L'argomento è convertito a decimale segnato (tipo int)
u L'argomento è convertito in decimale senza segno (tipo int)
o L'argomento è convertito in notazione ottale e priva di segno (tipo int)
x, X L'argomento è convertito in notazione esadecimale priva di segno (in minuscolo o maiuscolo) (tipo int)
c L'argomento è convertito in unsigned char e viene scritto il carattere risultante (tipo int)
s Stampa la stringa individuata dall'argomento, fino a raggiungere il carattere '\0' (tipo char *)
f Converte l'argomento in notazione decimale nel formato [-]ddd.ddd dove le cifre della parte decimale sono date dalla precisione, che per default vale 6 (tipo double)
e, E L'argomento è' stampato in notazione esponenziale, in cui viene riportata la mantissa, la parte decimale e l'esponete preceduto da e oppure da E, in funzione del carattere di conversione indicato. La parte decimale è determinata dalla precisione (default = 6) (tipo double)
g, G L'argomento è convertito con le regole definite per i caratteri di conversione f, e, E
p Viene stampato il valore del puntatore passato come argomento (tipo void *)
n Il numero di caratteri scritti vengono memorizzati nell'intero puntato dall'argomento. Nessun argomento viene convertito (tipo int *)
% Stampa il carattere '%'. Nessun argomento viene trattato
fscanf()
Prototipo:
int fscanf(FILE *stream, const char *format, ...);
Parametri in ingresso:
FILE *stream: indirizzo del file da aprire.
const char *format: sequenza di caratteri che identifica la modalità di apertura.
Valore di ritorno:
int: ritorna il numero delle variabili a cui sono stati assegnati i valori convertiti oppure EOF se e' stato riscontrato un errore di lettura dell'input oppure è stata incontrata la fine del file prima che sia stata effettuata almeno una conversione.
Descrizione:
La funzione fscanf() legge l'input da stream ed esegue le conversioni in base alla stringa di formattazione format assegnando i valori convertiti alle variabili, i cui puntatori sono passati come argomenti della funzione.
La maggior parte delle conversioni, saltano gli spazi bianchi iniziali.
In caso che format contenga dei caratteri ordinari, questi devono corrispondere ai caratteri letti in input.
La scansione si arresta quando un carattere in input non trova più corrispondenza con la stringa di formattazione, oppure quando una conversione non può essere eseguita.
Ogni direttiva di conversione inizia con il carattere % e termina con uno dei caratteri d, u, i, o, x, X, c, s, e, f, g, p, n, [, %.
Alcune dei caratteri di conversione possono essere preceduti da un carattere da un modificatore, cui qui non si fa riferimento.
Di seguito, per ciascuno dei caratteri di conversione ammessi, è riportato il significato.
d L'input è convertito in decimale intero con segno opzionale (tipo int *)
u L'input è convertito in decimale intero non segnato (tipo int *)
i L'input è convertito in un intero con segno opzionale (tipo int *)
o La conversione avviene leggendo l'input come intero in base 8 (numero ottale) privo di segno (tipo unsigned int *)
x, X La conversione avviene leggendo l'input come intero in base 16 (numero esadecimale) privo di segno (tipo unsigned int *)
c I prossimi caratteri (1 per default, o specificati dall'ampiezza) sono memorizzati nell'area indirizzata dal puntatore passato come argomento. Gli spazi iniziali non vengono scartati. Il terminatore '\0' non viene memorizzato. L'area puntata deve essere sufficientemente ampia per contenere i caratteri in input (tipo char * )
s Accetta una stringa di caratteri non comprendente gli spazi. Alla fine e' aggiunto il terminatore '\0'. L'area di memoria puntata dal puntatore passato in argomento deve essere sufficientemente ampia da contenere i caratteri letti in input ed in piu' il terminatore. L'input del campo si arresta quando viene incontrato uno spazio, oppure quando e' stata raggiunta la lunghezza della stringa definita dall'ampiezza massima (tipo char *)
e, f, g Accetta un numero decimale con segno, parte frazionaria ed esponente opzionali (tipo float *)
p Accetta un puntatore nello stesso formato da come viene stampato nella printf() con la direttiva di conversione "%p" (tipo void *)
[ Accetta dall'input una stringa formata esclusivamente dai caratteri compresi fra [ e ] della direttiva, oppure non compresi se il primo carattere fra le parentesi quadre [] e' '^'. L'area di memoria indirizzata dal puntatore, deve essere sufficientemente grande per accogliere tutti i caratteri selezionati (o al massimo il numero definito dall'ampiezza) piu' il terminatore '\0'. L'input termina quando viene rilevato un carattere che non appartiene (o appartiene, in caso di esclusione) al set richiesto, o al raggiungimento della dimensione massima (ampiezza). Per indicare che la parentesi quadra chiusa ] fa parte (o non fa parte) dei caratteri di selezione, questa deve essere il primo carattere della serie, dopo la parentesi quadra di apertura o dopo dell'accento circonflesso. Il carattere '-' indica un intervallo di caratteri, cosi' ad esempio "0-9" indica la selezione (o la esclusione, se il primo carattere e' '^') di tutte le cifre. Per includere anche il carattere '-' nella selezione, questo deve essere l'ultimo carattere della serie (tipo char *)
% Corrisponde alla costante '%' e tale carattere è atteso dall'input. Non avviene nessuna conversione.
Un descrizione dettagliata delle funzioni della libreria può essere trovata ai seguenti link:
it.wikibooks.org/wiki/C/Appendice/Librerie_standard/stdio.h
https://it.wikipedia.org/wiki/Stdio.h
Sito: 7ecnologie
Sezione: 08. C language
Capitolo: 03. Le librerie
Paragrafo: 01. Standard I/O - stdio.h
Indice dei capitoli: 00. Risorse - 01 Ambiente di sviluppo - 02. Introduzione al C - 03. Le librerie - 04. Tutorial - 05. Esercizi svolti - 98. Esercizi
Indice dei paragrafi: 01. Standard I/O - stdio.h - 02. Standard lib - stdlib.h - 03. Gestione stringhe - string.h - 04. Libreria matematica: math.h - 05. Chiamate di sistema - unistd.h