X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filestd.tex;h=e2c97bb7fcc0755f54115874179c63414ddfdfb8;hp=6730757a57cdb01d0fbea3d4153e3cf06cefaa89;hb=8895b3cb754738cb04bc9e4f9ce392d7812118c9;hpb=c35e7552a4a8ef0b39b306f516c00aca1b5a02d3 diff --git a/filestd.tex b/filestd.tex index 6730757..e2c97bb 100644 --- a/filestd.tex +++ b/filestd.tex @@ -362,23 +362,27 @@ modalit volta (con la bufferizzazione gestita automaticamente dalla libreria), vedi \secref{sec:file_char_io}. \end{enumerate} -e una modalità di input/output formattato. - -A differenza dell'interfaccia dei file descriptor 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 negativa, le - \acr{glibc} usano -1, altre implementazioni possono avere valori - diversi.} definito anch'esso nell'header \func{stdlib.h}. - -Dato che le funzioni dell'interfaccia degli stream sono funzioni di -libreria, esse non settano la variabile \var{errno}, che mantiene il -valore settato dalla system call che ha riportato l'errore, ma siccome -la condizione di end-of-file è anch'essa segnalata come errore, non -esisterebbe alcuna possibilità di distinguerla da un errore (\var{errno} -potrebbe essere stata settata in una altra occasione, vedi -\secref{sec:sys_errno}). +ed inoltre la modalità di input/output formattato. + +A differenza dell'interfaccia dei file descriptor 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 negativa, le \acr{glibc} usano -1, altre + implementazioni possono avere valori diversi.} definito anch'esso +nell'header \func{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. + +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 +funzionamento di \var{errno}). Per questo motivo tutte le implementazioni delle librerie standard mantengono per ogni stream almeno due flag all'interno dell'oggetto @@ -397,11 +401,12 @@ questi flag possono essere riletti dalle funzioni: flag sono settati. \end{functions} \noindent si tenga presente comunque che la lettura di questi flag segnala -soltanto che si è avuto un errore, o si è raggiunta la fine del file, in -una precedente operazione sullo stream. +soltanto che c'è stato un errore, o che si è raggiunta la fine del file in una +qualunque operazione sullo stream, il controllo quindi deve essere effettuato +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)} Cancella i flag di errore ed end-of-file di \param{stream}. \end{prototype} @@ -413,6 +418,8 @@ cos \subsection{Input/output a blocchi} \label{sec:file_block_io} +La prima e più immediata forma di + \subsection{Input/output a caratteri singoli} \label{sec:file_char_io} @@ -464,7 +471,30 @@ stream; questo pu scrittura. \end{functions} -Altre due funzioni, \func{\_\_freading} e \func{\_\_fwriting} servono +Altre due funzioni, \func{\_\_freading} e \func{\_\_fwriting} servono ad un +uso ancora più specialistico, il loro prototipo è: +\begin{functions} + \headdecl{stdio\_ext.h} + \funcdecl{int \_\_freading (FILE * stream)} + Restituisce un valore diverso da zero se \param{stream} è aperto in sola + lettura o se l'ultima operazione è stata di lettura. + + \funcdecl{int \_\_fwriting(FILE * stream)} + Restituisce un valore diverso da zero se \param{stream} è aperto in sola + scrittura o se l'ultima operazione è stata di scrittura. +\end{functions} + +Le due funzioni hanno lo scopo di determinare di che tipo è stata l'ultima +operazione eseguita su uno stream aperto in lettura/scrittura; ovviamente se +uno stream è aperto in sola lettura (o sola scrittura) la modalità dell'ultima +operazione è sempre determinata; l'unica ambiguità è quando non sono state +ancora eseguite operazioni, in questo caso le funzioni rispondono come se +una operazione ci fosse comunque stata. + +La conoscenza dell'ultima operazione effettuata su uno stream aperto in +lettura/scrittura è utile in quanto permette di trarre conclusioni sullo stato +del buffer e del suo contenuto. + \subsection{Il controllo della bufferizzazione} \label{sec:file_buffering_ctrl}