stream)}
Apre il file specificato da \param{path} associandolo allo stream
specificato da \param{stream}, se questo è già aperto prima lo chiude.
-
- Le funzioni ritornano un puntatore valido in caso di successo e \macro{NULL}
- in caso di errore, in tal caso \var{errno} viene settata al valore ricevuto
- dalla funzione sottostante di cui è fallita l'esecuzione.
- Gli errori pertanto possono essere quelli di \func{malloc} per tutte e tre
- le funzioni, quelli \func{open} per \func{fopen}, quelli di \func{fcntl} per
- \func{fdopen} e quelli di \func{fopen}, \func{fclose} e \func{fflush} per
- \func{freopen}.
+ \bodydesc{Le funzioni ritornano un puntatore valido in caso di
+ successo e \macro{NULL} in caso di errore, in tal caso \var{errno}
+ viene settata al valore ricevuto dalla funzione sottostante di cui è
+ fallita l'esecuzione.
+
+ Gli errori pertanto possono essere quelli di \func{malloc} per tutte
+ e tre le funzioni, quelli \func{open} per \func{fopen}, quelli di
+ \func{fcntl} per \func{fdopen} e quelli di \func{fopen},
+ \func{fclose} e \func{fflush} per \func{freopen}.}
\end{functions}
Normalmente la funzione che si usa per aprire uno stream è \func{fopen},
Entrambi i flag (di errore e di end-of-file) possono essere cancellati usando
la funzione \func{clearerr}, il cui prototipo è:
-\begin{prototype}{stdio.h}{void clearerr( FILE *stream)}
+\begin{prototype}{stdio.h}{void clearerr(FILE *stream)}
Cancella i flag di errore ed end-of-file di \param{stream}.
\end{prototype}
\noindent in genere si usa questa funziona una volta che si sia identificata e
\label{sec:file_char_io}
La seconda modalità di input/output è quella a caratteri, in cui si
-trasferisce un carattere alla volta.
-
-Le funzioni per la lettura a caratteri sono tre, \func{fgetc},
-\func{getc} e \func{getchar}, i rispettivi prototipi sono:
+trasferisce un carattere alla volta. Le funzioni per la lettura a
+caratteri sono tre, \func{fgetc}, \func{getc} e \func{getchar}, i
+rispettivi prototipi sono:
\begin{functions}
\headdecl{stdio.h}
\funcdecl{int getchar(void)} è equivalente a \func{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 è
- \macro{EOF}.
+ \bodydesc{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 è \macro{EOF}.}
\end{functions}
A parte \func{getchar}, che si usa in genere per leggere un carattere da
\funcdecl{wint\_t getwchar(void)} è equivalente a \func{getwc(stdin)}.
- Tutte queste funzioni leggono un carattere alla volta, in caso di
- errore o fine del file il valore di ritorno è \macro{WEOF}.
+ \bodydesc{Tutte queste funzioni leggono un carattere alla volta, in
+ caso di errore o fine del file il valore di ritorno è \macro{WEOF}.}
\end{functions}
Per scrivere un carattere si possono usare tre funzioni analoghe alle
\funcdecl{int putchar(void)} è equivalente a \func{putc(stdin)}.
-\item \noindent 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 è \macro{EOF}.
+ \bodydesc{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 è \macro{EOF}.}
\end{functions}
Tutte queste funzioni scrivono sempre un byte alla volta, anche se
\funcdecl{int getw(FILE *stream)} Legge una parola da \param{stream}.
\funcdecl{int putw(int w, FILE *stream)} Scrive la parola \param{w} su
\param{stream}.
-
- Le funzioni restituiscono la parola \param{w}, o \macro{EOF} in caso
- di errore o di fine del file.
+
+ \bodydesc{Le funzioni restituiscono la parola \param{w}, o \macro{EOF}
+ in caso di errore o di fine del file.}
\end{functions}
-l'uso di queste funzioni è deprecato in favore dell'uso di \func{fread}
-e \func{fwrite}, in quanto non è possibile distinguere il valore -1 da una
-condizione di errore che restituisce \macro{EOF}.
+\noindent l'uso di queste funzioni è deprecato in favore dell'uso di
+\func{fread} e \func{fwrite}, in quanto non è possibile distinguere il
+valore -1 da una condizione di errore che restituisce \macro{EOF}.
+
+Una degli usi più frequenti dell'input/output a caratteri è nei
+programmi di \textit{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 \textit{peeking
+ ahead}) in modo che il programma possa regolarsi sulla base avendo
+dato una \textsl{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 \func{ungetc} ed il suo prototipo è:
+\begin{prototype}{stdio.h}{int ungetc(int c, FILE *stream)}
+ Cancella i flag di errore ed end-of-file di \param{stream}.
+\end{prototype}
+
+
+
\subsection{Input/output di linea}
\funcdecl{char * fgets(char * string, int size, FILE *stream)}
Scrive su \param{string} la linea letta da \param{stream} per un
massimo di \param{size} byte.
-
- Le funzioni restituiscono della stringa letta o \macro{NULL} in caso
- di errore.
+
+ \bodydesc{Le funzioni restituiscono della stringa letta o \macro{NULL}
+ in caso di errore.}
\end{functions}