X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filestd.tex;h=de338feb1a09b4740e1fe298c1947c5016e7d16d;hp=dcbb3381f146bb7cd6d0141571274232de019601;hb=487b554b85cda92d10367d5af69a0355b9b2329d;hpb=a76ef671288ddb656f3a4aa599cfda5e05491c39 diff --git a/filestd.tex b/filestd.tex index dcbb338..de338fe 100644 --- a/filestd.tex +++ b/filestd.tex @@ -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. - - 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}, @@ -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 è: -\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 @@ -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 -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} @@ -583,9 +583,9 @@ Le funzioni per la lettura a caratteri sono tre, \func{fgetc}, \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 @@ -623,8 +623,8 @@ byte restituiscono un carattere in formato esteso (cio \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 @@ -641,9 +641,9 @@ precedenti usate per leggere: \func{putc}, \func{fputc} e \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 @@ -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}. - - 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} @@ -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. - - 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}