X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filestd.tex;h=78a524cee948dfd9f87b661370e5e019454e8ba1;hp=aa4d1ccfa3e1475b45e4fd019cca5e5acad96e7d;hb=f2dfb330dfc756851edc4eecf828a435e7f5f279;hpb=01e363536700694f191264cf2c2955b31116d1e3 diff --git a/filestd.tex b/filestd.tex index aa4d1cc..78a524c 100644 --- a/filestd.tex +++ b/filestd.tex @@ -59,17 +59,17 @@ formattazioni), i file stream restano del tutto equivalenti ai file descriptor \secref{sec:file_access_control} per il controllo di accesso. -\subsection{Gli oggetti \type{FILE}} +\subsection{Gli oggetti \ctyp{FILE}} \label{sec:file_FILE} Per ragioni storiche la struttura di dati che rappresenta uno stream è stata -chiamata \type{FILE}, questi oggetti sono creati dalle funzioni di libreria e +chiamata \ctyp{FILE}, questi oggetti sono creati dalle funzioni di libreria e contengono tutte le informazioni necessarie a gestire le operazioni sugli stream, come la posizione corrente, lo stato del buffer e degli indicatori di stato e di fine del file. Per questo motivo gli utenti non devono mai utilizzare direttamente o -allocare queste strutture, ma usare sempre puntatori del tipo \type{FILE +allocare queste strutture, ma usare sempre puntatori del tipo \ctyp{FILE *} ottenuti dalla libreria stessa (tanto che in certi casi il termine di puntatore a file è diventato sinonimo di stream). Tutte le funzioni della libreria che operano sui file accettano come parametri solo @@ -102,7 +102,7 @@ definiti nell'header \file{stdio.h} che sono: \end{basedescript} Nelle \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono -effettivamente tre variabili di tipo \type{FILE *} che possono essere +effettivamente tre variabili di tipo \ctyp{FILE *} che possono essere usate come tutte le altre, ad esempio si può effettuare una redirezione dell'output di un programma con il semplice codice: \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{} @@ -163,7 +163,7 @@ standard input siano aperti in modalit non fanno riferimento ad un dispositivo interattivo, e che lo standard error non sia mai aperto in modalità \textit{fully buffered}. -Linux, come BSD e SVr4, specifica il comportamento di default in maniera +Linux, come BSD e SVr4, specifica il comportamento predefinito in maniera ancora più precisa, e cioè impone che lo standard error sia sempre \textit{unbuffered} (in modo che i messaggi di errore siano mostrati il più rapidamente possibile) e che standard input e standard output siano aperti in @@ -222,10 +222,9 @@ Le funzioni che si possono usare per aprire uno stream sono solo tre: Apre il file specificato da \param{path} associandolo allo stream specificato da \param{stream}, se questo è già aperto prima lo chiude. - \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. + \bodydesc{Le funzioni ritornano un puntatore valido in caso di successo e + \macro{NULL} in caso di errore, in tal caso \var{errno} assumerà il valore + ricevuto dalla funzione sottostante di cui è fallita l'esecuzione. Gli errori pertanto possono essere quelli di \code{malloc} per tutte e tre le funzioni, quelli \func{open} per \func{fopen}, quelli di @@ -310,12 +309,12 @@ opportune funzioni di conversione in lettura e scrittura. Nel caso si usi \func{fdopen} i valori specificati da \param{mode} devono essere compatibili con quelli con cui il file descriptor è stato aperto. Inoltre i modi \cmd{w} e \cmd{w+} non troncano il file. La posizione nello -stream viene settata a quella corrente nel file descriptor, e le variabili di +stream viene impostata a quella corrente nel file descriptor, e le variabili di errore e di fine del file (vedi \secref{sec:file_io}) sono cancellate. Il file non viene duplicato e verrà chiuso alla chiusura dello stream. I nuovi file saranno creati secondo quanto visto in -\secref{sec:file_ownership} ed avranno i permessi di accesso settati al +\secref{sec:file_ownership} ed avranno i permessi di accesso impostati al valore \macro{S\_IRUSR|S\_IWUSR|S\_IRGRP|S\_IWGRP|S\_IROTH|S\_IWOTH} (pari a \macro{0666}) modificato secondo il valore di \acr{umask} per il processo (si veda \secref{sec:file_umask}). @@ -344,7 +343,7 @@ Uno stream viene chiuso con la funzione \func{fclose} il cui prototipo Chiude lo stream \param{stream}. \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 + nel qual caso imposta \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}).} @@ -396,25 +395,25 @@ A differenza dell'interfaccia dei file descriptor, con gli stream il raggiungimento della fine del file è considerato un errore, e viene notificato come tale dai valori di uscita delle varie funzioni. Nella maggior parte dei casi questo avviene con la restituzione del valore -intero (di tipo \type{int}) \macro{EOF}\footnote{la costante deve essere +intero (di tipo \ctyp{int}) \macro{EOF}\footnote{la costante deve essere negativa, le \acr{glibc} usano -1, altre implementazioni possono avere valori diversi.} definito anch'esso nell'header \file{stdlib.h}. Dato che le funzioni dell'interfaccia degli stream sono funzioni di libreria -che si appoggiano a delle system call, esse non settano direttamente la -variabile \var{errno}, che mantiene il valore settato dalla system call che ha -riportato l'errore. +che si appoggiano a delle system call, esse non impostano direttamente la +variabile \var{errno}, che mantiene il valore impostato dalla system call che +ha riportato l'errore. Siccome la condizione di end-of-file è anch'essa segnalata come errore, nasce il problema di come distinguerla da un errore effettivo; basarsi solo sul valore di ritorno della funzione e controllare il valore di \var{errno} -infatti non basta, dato che quest'ultimo potrebbe essere stato settato in una -altra occasione, (si veda \secref{sec:sys_errno} per i dettagli del +infatti non basta, dato che quest'ultimo potrebbe essere stato impostato in +una altra occasione, (si veda \secref{sec:sys_errno} per i dettagli del funzionamento di \var{errno}). Per questo motivo tutte le implementazioni delle librerie standard mantengono per ogni stream almeno due flag all'interno dell'oggetto -\type{FILE}, il flag di \textit{end-of-file}, che segnala che si è +\ctyp{FILE}, il flag di \textit{end-of-file}, che segnala che si è raggiunta la fine del file in lettura, e quello di errore, che segnala la presenza di un qualche errore nelle operazioni di input/output; questi due flag possono essere riletti dalle funzioni: @@ -426,7 +425,7 @@ questi due flag possono essere riletti dalle funzioni: Controlla il flag di errore di \param{stream}. \bodydesc{Entrambe le funzioni ritornano un valore diverso da zero se - i relativi flag sono settati.} + i relativi flag sono impostati.} \end{functions} \noindent si tenga presente comunque che la lettura di questi flag segnala soltanto che c'è stato un errore, o che si è raggiunta la fine del file in una @@ -474,7 +473,7 @@ In genere si usano queste funzioni quando si devono trasferire su file blocchi di dati binari in maniera compatta e veloce; un primo caso di uso tipico è quello in cui si salva un vettore (o un certo numero dei suoi elementi) con una chiamata del tipo: -\footnotesize +%\footnotesize \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{} int WriteVect(FILE *stream, double *vec, size_t nelem) { @@ -486,12 +485,12 @@ int WriteVect(FILE *stream, double *vec, size_t nelem) return nread; } \end{lstlisting} -\normalsize +%\normalsize in questo caso devono essere specificate le dimensioni di ciascun elemento ed il numero di quelli che si vogliono scrivere. Un secondo caso è invece quello in cui si vuole trasferire su file una struttura; si avrà allora una chiamata tipo: -\footnotesize +%\footnotesize \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{} struct histogram { int nbins; @@ -507,7 +506,7 @@ int WriteStruct(FILE *stream, struct histogram *histo, size_t nelem) return nread; } \end{lstlisting} -\normalsize +%\normalsize in cui si specifica la dimensione dell'intera struttura ed un solo elemento. @@ -519,7 +518,7 @@ ma il numero di elementi. La funzione \func{fread} legge sempre un numero intero di elementi, se incontra la fine del file l'oggetto letto parzialmente viene scartato (lo stesso avviene in caso di errore). In questo caso la posizione dello -stream viene settata alla fine del file (e non a quella corrispondente +stream viene impostata alla fine del file (e non a quella corrispondente alla quantità di dati letti). In caso di errore (o fine del file per \func{fread}) entrambe le @@ -583,9 +582,9 @@ rispettivi prototipi sono: \funcdecl{int getc(FILE *stream)} Legge un byte da \param{stream} e lo restituisce come intero. In genere è implementata come una macro. - + \funcdecl{int fgetc(FILE *stream)} Legge un byte da \param{stream} e lo - restituisce come intero. È una sempre una funzione. + restituisce come intero. È sempre una funzione. \funcdecl{int getchar(void)} Equivalente a \code{getc(stdin)}. @@ -609,15 +608,15 @@ della chiamata, ma essere passato come parametro ad un altra funzione (e non si hanno i problemi accennati in precedenza con \param{stream}). -Le tre funzioni restituiscono tutte un \type{unsigned char} convertito -ad \type{int} (si usa \type{unsigned char} in modo da evitare +Le tre funzioni restituiscono tutte un \ctyp{unsigned char} convertito +ad \ctyp{int} (si usa \ctyp{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 che invece di un carattere di un byte restituiscono un carattere in formato esteso (cioè di tipo -\type{wint\_t}, il loro prototipo è: +\ctyp{wint\_t}, il loro prototipo è: \begin{functions} \headdecl{stdio.h} \headdecl{wchar.h} @@ -654,8 +653,8 @@ precedenti usate per leggere: \func{putc}, \func{fputc} e \end{functions} Tutte queste funzioni scrivono sempre un byte alla volta, anche se -prendono come parametro un \type{int} (che pertanto deve essere ottenuto -con un cast da un \type{unsigned char}). Anche il valore di ritorno è +prendono come parametro un \ctyp{int} (che pertanto deve essere ottenuto +con un cast da un \ctyp{unsigned char}). Anche il valore di ritorno è sempre un intero; in caso di errore o fine del file il valore di ritorno è \macro{EOF}. @@ -666,7 +665,7 @@ esattamente le stesse operazioni evitando per stream. Per compatibilità con SVID sono provviste anche due funzioni per leggere -e scrivere una \textit{word} (che è sempre definita come \type{int}); i +e scrivere una \textit{word} (che è sempre definita come \ctyp{int}); i loro prototipi sono: \begin{functions} \headdecl{stdio.h} @@ -694,7 +693,7 @@ leggendo il carattere, e poi rimandandolo indietro, cosicch 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)} - Rimanda indietro il carattere \param{c}, con un cast a \type{unsigned + Rimanda indietro il carattere \param{c}, con un cast a \ctyp{unsigned char}, sullo stream \param{stream}. \bodydesc{La funzione ritorna \param{c} in caso di successo e @@ -882,7 +881,7 @@ usati dei \textit{value result argument}, passando dei puntatori anzich i valori delle variabili, secondo la tecnica spiegata in \secref{sec:proc_var_passing}). -Se si passa alla funzione l'indirizzo ad un puntatore settato a +Se si passa alla funzione l'indirizzo ad un puntatore impostato a \macro{NULL} e \var{*n} è zero, la funzione provvede da sola all'allocazione della memoria necessaria a contenere la linea. In tutti i casi si ottiene dalla funzione un puntatore all'inizio del testo della @@ -969,34 +968,34 @@ dei parametri che dovranno essere passati a seguire. \textbf{Valore} & \textbf{Tipo} & \textbf{Significato} \\ \hline \hline - \cmd{\%d} &\type{int} & Stampa un numero intero in formato decimale + \cmd{\%d} &\ctyp{int} & Stampa un numero intero in formato decimale con segno \\ - \cmd{\%i} &\type{int} & Identico a \cmd{\%i} in output, \\ - \cmd{\%o} &\type{unsigned int}& Stampa un numero intero come ottale\\ - \cmd{\%u} &\type{unsigned int}& Stampa un numero intero in formato + \cmd{\%i} &\ctyp{int} & Identico a \cmd{\%i} in output, \\ + \cmd{\%o} &\ctyp{unsigned int}& Stampa un numero intero come ottale\\ + \cmd{\%u} &\ctyp{unsigned int}& Stampa un numero intero in formato decimale senza segno \\ \cmd{\%x}, - \cmd{\%X} &\type{unsigned int}& Stampano un intero in formato esadecimale, + \cmd{\%X} &\ctyp{unsigned int}& Stampano un intero in formato esadecimale, rispettivamente con lettere minuscole e maiuscole. \\ - \cmd{\%f} &\type{unsigned int}& Stampa un numero in virgola mobile con la + \cmd{\%f} &\ctyp{unsigned int}& Stampa un numero in virgola mobile con la notazione a virgola fissa \\ \cmd{\%e}, - \cmd{\%E} &\type{double} & Stampano un numero in virgola mobile con la + \cmd{\%E} &\ctyp{double} & Stampano un numero in virgola mobile con la notazione esponenziale, rispettivamente con lettere minuscole e maiuscole. \\ \cmd{\%g}, - \cmd{\%G} &\type{double} & Stampano un numero in virgola mobile con la + \cmd{\%G} &\ctyp{double} & Stampano un numero in virgola mobile con la notazione più appropriate delle due precedenti, rispettivamente con lettere minuscole e maiuscole. \\ \cmd{\%a}, - \cmd{\%A} &\type{double} & Stampano un numero in virgola mobile in + \cmd{\%A} &\ctyp{double} & Stampano un numero in virgola mobile in notazione esadecimale frazionaria\\ - \cmd{\%c} &\type{int} & Stampa un carattere singolo\\ - \cmd{\%s} &\type{char *} & Stampa una stringa \\ - \cmd{\%p} &\type{void *} & Stampa il valore di un puntatore\\ - \cmd{\%n} &\type{\&int} & Prende il numero di caratteri stampati finora\\ + \cmd{\%c} &\ctyp{int} & Stampa un carattere singolo\\ + \cmd{\%s} &\ctyp{char *} & Stampa una stringa \\ + \cmd{\%p} &\ctyp{void *} & Stampa il valore di un puntatore\\ + \cmd{\%n} &\ctyp{\&int} & Prende il numero di caratteri stampati finora\\ \cmd{\%\%}& & Stampa un \% \\ \hline \end{tabular} @@ -1056,8 +1055,8 @@ questo ordine: \end{itemize*} -Dettagli ulteriori sulle varie opzioni possono essere trovati nella man page -di \func{printf} e nella documentazione delle \acr{glibc}. +Dettagli ulteriori sulle varie opzioni possono essere trovati nella pagina di +manuale di \func{printf} e nella documentazione delle \acr{glibc}. \begin{table}[htb] \centering @@ -1067,21 +1066,21 @@ di \func{printf} e nella documentazione delle \acr{glibc}. \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \cmd{hh} & una conversione intera corrisponde a un \type{char} con o senza + \cmd{hh} & una conversione intera corrisponde a un \ctyp{char} con o senza segno, o il puntatore per il numero dei parametri \cmd{n} è di - tipo \type{char}.\\ - \cmd{h} & una conversione intera corrisponde a uno \type{short} con o + tipo \ctyp{char}.\\ + \cmd{h} & una conversione intera corrisponde a uno \ctyp{short} con o senza segno, o il puntatore per il numero dei parametri \cmd{n} - è di tipo \type{short}.\\ - \cmd{l} & una conversione intera corrisponde a un \type{long} con o + è di tipo \ctyp{short}.\\ + \cmd{l} & una conversione intera corrisponde a un \ctyp{long} con o senza segno, o il puntatore per il numero dei parametri \cmd{n} - è di tipo \type{long}, o il carattere o la stringa seguenti + è di tipo \ctyp{long}, o il carattere o la stringa seguenti sono in formato esteso.\\ - \cmd{ll} & una conversione intera corrisponde a un \type{long long} con o + \cmd{ll} & una conversione intera corrisponde a un \ctyp{long long} con o senza segno, o il puntatore per il numero dei parametri \cmd{n} - è di tipo \type{long long}.\\ + è di tipo \ctyp{long long}.\\ \cmd{L} & una conversione in virgola mobile corrisponde a un - \type{double}.\\ + \ctyp{double}.\\ \cmd{q} & sinonimo di \cmd{ll}.\\ \cmd{j} & una conversione intera corrisponde a un \type{intmax\_t} o \type{uintmax\_t}.\\ @@ -1204,7 +1203,7 @@ spazio in \param{format} corrisponde con un numero qualunque di caratteri di separazione (che possono essere spazi, tabulatori, virgole etc.), mentre caratteri diversi richiedono una corrispondenza esatta. Le direttive di conversione sono analoghe a quelle di \func{printf} e si trovano descritte in -dettaglio nelle man page e nel manuale delle \acr{glibc}. +dettaglio nelle pagine di manuale e nel manuale delle \acr{glibc}. Le funzioni eseguono la lettura dall'input, scartano i separatori (e gli eventuali caratteri diversi indicati dalla stringa di formato) effettuando le @@ -1275,7 +1274,7 @@ cui prototipo \bodydesc{La funzione restituisce la posizione corrente, o -1 in caso di fallimento, che può esser dovuto sia al fatto che il file non supporta il riposizionamento che al fatto che la posizione non può - essere espressa con un \type{long int}} + essere espressa con un \ctyp{long int}} \end{prototype} \noindent la funzione restituisce la posizione come numero di byte dall'inizio dello stream. @@ -1288,7 +1287,7 @@ pu \begin{functions} \headdecl{stdio.h} - \funcdecl{int fsetpos(FILE *stream, fpos\_t *pos)} Setta la posizione + \funcdecl{int fsetpos(FILE *stream, fpos\_t *pos)} Imposta la posizione corrente nello stream \param{stream} al valore specificato da \param{pos}. \funcdecl{int fgetpos(FILE *stream, fpos\_t *pos)} Scrive la posizione @@ -1301,7 +1300,7 @@ pu In Linux, a partire dalle glibc 2.1, sono presenti anche le due funzioni \func{fseeko} e \func{ftello}, che assolutamente identiche alle precedenti \func{fseek} e \func{ftell} ma hanno argomenti di tipo \type{off\_t} anziché -di tipo \type{long int}. +di tipo \ctyp{long int}. @@ -1326,8 +1325,8 @@ della funzione Legge il file descriptor sottostante lo stream \param{stream}. \bodydesc{Restituisce il numero del file descriptor in caso di successo, e - -1 qualora \param{stream} non sia valido, nel qual caso setta \var{errno} - a \macro{EBADF}.} + -1 qualora \param{stream} non sia valido, nel qual caso imposta + \var{errno} a \macro{EBADF}.} \end{prototype} \noindent ed in questo modo diventa possibile usare direttamente \func{fcntl}. @@ -1393,11 +1392,12 @@ suo prototipo \begin{prototype}{stdio.h}{int setvbuf(FILE *stream, char *buf, int mode, size\_t size)} - Setta la bufferizzazione dello stream \param{stream} nella modalità indicata - da \param{mode}, usando \param{buf} come buffer di lunghezza \param{size}. + Imposta la bufferizzazione dello stream \param{stream} nella modalità + indicata da \param{mode}, usando \param{buf} come buffer di lunghezza + \param{size}. \bodydesc{Restituisce zero in caso di successo, ed un valore qualunque in - caso di errore, nel qual caso \var{errno} viene settata opportunamente.} + caso di errore, nel qual caso \var{errno} viene impostata opportunamente.} \end{prototype} La funzione permette di controllare tutti gli aspetti della bufferizzazione; @@ -1438,11 +1438,11 @@ coincidano con quelle su cui viene effettuato l'I/O. \hline \end{tabular} \caption{Valori del parametro \param{mode} di \func{setvbuf} - per il settaggio delle modalità di bufferizzazione.} + per l'impostazione delle modalità di bufferizzazione.} \label{tab:file_stream_buf_mode} \end{table} -Per evitare che \func{setvbuf} setti il buffer basta passare un valore +Per evitare che \func{setvbuf} imposti il buffer basta passare un valore \macro{NULL} per \param{buf} e la funzione ignorerà il parametro \param{size} usando il buffer allocato automaticamente dal sistema. Si potrà comunque modificare la modalità di bufferizzazione, passando in \param{mode} uno degli @@ -1491,7 +1491,7 @@ scelta, si pu Forza la scrittura di tutti i dati bufferizzati dello stream \param{stream}. \bodydesc{Restituisce zero in caso di successo, ed \macro{EOF} in caso di - errore, settando \var{errno} a \macro{EBADF} se \param{stream} non è + errore, impostando \var{errno} a \macro{EBADF} se \param{stream} non è aperto o non è aperto in scrittura, o ad uno degli errori di \func{write}.} \end{prototype} @@ -1600,12 +1600,12 @@ prototipo valori \macro{FSETLOCKING\_INTERNAL} o \macro{FSETLOCKING\_BYCALLER}.} \end{prototype} -La funzione setta o legge lo stato della modalità di operazione di uno stream +La funzione imposta o legge lo stato della modalità di operazione di uno stream nei confronti del locking a seconda del valore specificato con \param{type}, che può essere uno dei seguenti: \begin{basedescript}{\desclabelwidth{4.0cm}} \item[\macro{FSETLOCKING\_INTERNAL}] Lo stream userà da ora in poi il blocco - implicito di default. + implicito predefinito. \item[\macro{FSETLOCKING\_BYCALLER}] Al ritorno della funzione sarà l'utente a dover gestire da solo il locking dello stream. \item[\macro{FSETLOCKING\_QUERY}] Restituisce lo stato corrente della modalità