Riforma delle macro per le funzioni, si riformatta un bel po' di roba.
[gapil.git] / filestd.tex
index dcbb3381f146bb7cd6d0141571274232de019601..de338feb1a09b4740e1fe298c1947c5016e7d16d 100644 (file)
@@ -223,15 +223,16 @@ prototipi sono:
   stream)}
   Apre il file specificato da \param{path} associandolo allo stream
   specificato da \param{stream}, se questo è già aperto prima lo chiude.
   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},
 \end{functions}
 
 Normalmente la funzione che si usa per aprire uno stream è \func{fopen},
@@ -432,7 +433,7 @@ ogni volta che si chiama una funzione di libreria.
 
 Entrambi i flag (di errore e di end-of-file) possono essere cancellati usando
 la funzione \func{clearerr}, il cui prototipo è:
 
 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
   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
@@ -568,10 +569,9 @@ gestione delle applicazioni multi-thread (si veda
 \label{sec:file_char_io}
 
 La seconda modalità di input/output è quella a caratteri, in cui si
 \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} 
 
 \begin{functions}
   \headdecl{stdio.h} 
 
@@ -583,9 +583,9 @@ Le funzioni per la lettura a caratteri sono tre, \func{fgetc},
   
   \funcdecl{int getchar(void)} è equivalente a \func{getc(stdin)}.
   
   
   \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
 \end{functions}
 
 A parte \func{getchar}, che si usa in genere per leggere un carattere da
@@ -623,8 +623,8 @@ byte restituiscono un carattere in formato esteso (cio
   
   \funcdecl{wint\_t getwchar(void)} è equivalente a \func{getwc(stdin)}.
   
   
   \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
 \end{functions}
 
 Per scrivere un carattere si possono usare tre funzioni analoghe alle
@@ -641,9 +641,9 @@ precedenti usate per leggere: \func{putc}, \func{fputc} e
   
   \funcdecl{int putchar(void)} è equivalente a \func{putc(stdin)}.
   
   
   \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
 \end{functions}
 
 Tutte queste funzioni scrivono sempre un byte alla volta, anche se
@@ -666,13 +666,31 @@ loro prototipi sono:
   \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}.
   \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}
 \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}
 
 
 \subsection{Input/output di linea}
@@ -693,9 +711,9 @@ Le funzioni per leggere una linea sono sostazialmente due, \func{gets} e
   \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.
   \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}
 
 
 \end{functions}