X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=filestd.tex;h=9094ab3c98de33a77d7ea5adc4202020d9923d01;hb=0c7fb286c2c1b480ed81f7ce8d506b179e5d291e;hp=dcbb3381f146bb7cd6d0141571274232de019601;hpb=a76ef671288ddb656f3a4aa599cfda5e05491c39;p=gapil.git diff --git a/filestd.tex b/filestd.tex index dcbb338..9094ab3 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}, @@ -341,10 +342,11 @@ Uno stream viene chiuso con la funzione \func{fclose} il cui prototipo \begin{prototype}{stdio.h}{int fclose(FILE * stream)} Chiude lo stream \param{stream}. - Restituisce 0 in caso di successo e \macro{EOF} in caso di errore, nel qual - caso setta \var{errno} a \macro{EBADF} se il file descriptor indicato da - \param{stream} non è valido, o uno dei valori specificati dalla sottostante - funzione che è fallita (\func{close}, \func{write} o \func{fflush}). + \bodydesc{Restituisce 0 in caso di successo e \macro{EOF} in caso di errore, + nel qual caso setta \var{errno} a \macro{EBADF} se il file descriptor + indicato da \param{stream} non è valido, o uno dei valori specificati + dalla sottostante funzione che è fallita (\func{close}, \func{write} o + \func{fflush}).} \end{prototype} La funzione effettua uno scarico di tutti i dati presenti nei buffer di @@ -360,7 +362,7 @@ prototipo \begin{prototype}{stdio.h}{int fcloseall(void)} Chiude tutti gli stream. - Restituisce 0 se non ci sono errori ed \macro{EOF} altrimenti. + \bodydesc{Restituisce 0 se non ci sono errori ed \macro{EOF} altrimenti.} \end{prototype} la funzione esegue lo scarico dei dati bufferizzati in uscita e scarta quelli in ingresso, chiudendo tutti i file. Questa funzione è provvista solo per i @@ -432,7 +434,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 @@ -457,13 +459,12 @@ formattati. Le due funzioni che si usano per l'I/O binario sono: \funcdecl{size\_t fwrite(const void * ptr, size\_t size, size\_t nmemb, FILE * stream)} - Le funzioni rispettivamente leggono e scrivono \param{nmemb} elementi - di dimensione \param{size} dal buffer \param{ptr} al file - \param{stream}. + Rispettivamente leggono e scrivono \param{nmemb} elementi di dimensione + \param{size} dal buffer \param{ptr} al file \param{stream}. - Entrambe le funzioni ritornano il numero di elementi letti o scritti, - in caso di errore o fine del file viene restituito un numero di - elementi inferiore al richiesto. + \bodydesc{Entrambe le funzioni ritornano il numero di elementi letti o + scritti, in caso di errore o fine del file viene restituito un numero di + elementi inferiore al richiesto.} \end{functions} In genere si usano queste funzioni quando si devono trasferire su file @@ -557,8 +558,8 @@ gestione delle applicazioni multi-thread (si veda \funcdecl{size\_t fwrite\_unlocked(const void * ptr, size\_t size, size\_t nmemb, FILE * stream)} - Le funzioni sono identiche alle analoghe \func{fread} e \func{fwrite} - ma non acquisiscono il lock implicito sullo stream. + \bodydesc{Le funzioni sono identiche alle analoghe \func{fread} e + \func{fwrite} ma non acquisiscono il lock implicito sullo stream.} \end{functions} \noindent entrambe le funzioni sono estensioni GNU previste solo dalle \acr{glibc}. @@ -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} @@ -581,11 +581,11 @@ Le funzioni per la lettura a caratteri sono tre, \func{fgetc}, \funcdecl{int fgetc(FILE *stream)} Legge un byte da \param{stream} e lo restituisce come intero. È una sempre una funzione. - \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 @@ -621,10 +621,10 @@ byte restituiscono un carattere in formato esteso (cio \funcdecl{wint\_t fgetwc(FILE *stream)} Legge un carattere esteso da \param{stream} È una sempre una funzione. - \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 @@ -639,11 +639,11 @@ precedenti usate per leggere: \func{putc}, \func{fputc} e \funcdecl{int fputc(FILE *stream)} Scrive il carattere \param{c} su \param{stream}. È una sempre una funzione. - \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 @@ -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}