Legge un byte da stream e lo restituisce come intero. In genere è implementata come una macro.
Legge un byte da stream e lo restituisce come intero. È sempre una funzione.
Equivalente a getc(stdin).
Tutte queste funzioni leggono un byte alla volta, che viene restituito come intero; in caso di errore o fine del file il valore di ritorno è EOF.
A parte getchar, che si usa in genere per leggere un carattere da tastiera, le altre due funzioni sono sostanzialmente equivalenti. La differenza è che getc è ottimizzata al massimo e normalmente viene implementata con una macro, per cui occorre stare attenti a cosa le si passa come argomento, infatti stream può essere valutato più volte nell'esecuzione, e non viene passato in copia con il meccanismo visto in sez. 2.4.1; per questo motivo se si passa un'espressione si possono avere effetti indesiderati.
Invece fgetc è assicurata essere sempre una funzione, per questo motivo la sua esecuzione normalmente è più lenta per via dell'overhead della chiamata, ma è altresì possibile ricavarne l'indirizzo, che può essere passato come parametro ad un altra funzione (e non si hanno i problemi accennati in precedenza nel tipo di argomento).
Le tre funzioni restituiscono tutte un unsigned char convertito ad int (si usa unsigned char in modo da evitare l'espansione del segno). In questo modo il valore di ritorno è sempre positivo, tranne in caso di errore o fine del file.
Nelle estensioni GNU che provvedono la localizzazione sono definite tre funzioni equivalenti alle precedenti, getwc, fgetwc e getwchar, che invece di un carattere di un byte restituiscono un carattere in formato esteso (cioè di tipo wint_t), il loro prototipo è:
Legge un carattere esteso da stream. In genere è implementata come una macro.
Legge un carattere esteso da stream È una sempre una funzione.
Equivalente a getwc(stdin).
Tutte queste funzioni leggono un carattere alla volta, in caso di errore o fine del file il valore di ritorno è WEOF.
Per scrivere un carattere si possono usare tre funzioni, analoghe alle precedenti usate per leggere: putc, fputc e putchar; i loro prototipi sono:
Scrive il carattere c su stream. In genere è implementata come una macro.
Scrive il carattere c su stream. È una sempre una funzione.
Equivalente a putc(stdin).
Le funzioni scrivono sempre un carattere alla volta, il cui valore viene restituito in caso di successo; in caso di errore o fine del file il valore di ritorno è EOF.
Tutte queste funzioni scrivono sempre un byte alla volta, anche se prendono come parametro un int (che pertanto deve essere ottenuto con un cast da un unsigned char). Anche il valore di ritorno è sempre un intero; in caso di errore o fine del file il valore di ritorno è EOF.
Come nel caso dell'I/O binario con fread e fwrite le glibc provvedono come estensione, per ciascuna delle funzioni precedenti, un'ulteriore funzione, il cui nome è ottenuto aggiungendo un _unlocked, che esegue esattamente le stesse operazioni, evitando però il lock implicito dello stream.
Per compatibilità con SVID sono inoltre provviste anche due funzioni, getw e putw, da usare per leggere e scrivere una word (cioè due byte in una volta); i loro prototipi sono:
Legge una parola da stream.
Scrive la parola w su stream.
Le funzioni restituiscono la parola w, o EOF in caso di errore o di fine del file.
Le funzioni leggono e scrivono una word di due byte, usando comunque una variabile di tipo int; il loro uso è deprecato in favore dell'uso di fread e fwrite, in quanto non è possibile distinguere il valore -1 da una condizione di errore che restituisce EOF.
Uno degli usi più frequenti dell'input/output a caratteri è nei programmi di parsing in cui si analizza il testo; in questo contesto diventa utile poter analizzare il carattere successivo da uno stream senza estrarlo effettivamente (la tecnica è detta peeking ahead) in modo che il programma possa regolarsi avendo dato una sbirciatina a quello che viene dopo.
Nel nostro caso questo tipo di comportamento può essere realizzato prima leggendo il carattere, e poi rimandandolo indietro, cosicché ridiventi disponibile per una lettura successiva; la funzione che inverte la lettura si chiama ungetc ed il suo prototipo è:
Rimanda indietro il carattere c, con un cast a unsigned char, sullo stream stream.
La funzione ritorna c in caso di successo e EOF in caso di errore.
Non è necessario che il carattere che si manda indietro sia l'ultimo che si è letto, e non è necessario neanche avere letto nessun carattere prima di usare ungetc, ma di norma la funzione è intesa per essere usata per rimandare indietro l'ultimo carattere letto.
Nel caso c sia un EOF la funzione non fa nulla, e restituisce sempre EOF; così si può usare ungetc anche con il risultato di una lettura alla fine del file.
Se si è alla fine del file si può comunque rimandare indietro un carattere, il flag di end-of-file verrà automaticamente cancellato perché c'è un nuovo carattere disponibile che potrà essere riletto successivamente.
Infine si tenga presente che ungetc non altera il contenuto del file, ma opera esclusivamente sul buffer interno. Se si esegue una qualunque delle operazioni di riposizionamento (vedi sez. 7.2.7) i caratteri rimandati indietro vengono scartati.