X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filestd.tex;h=2a22545a15e690ba79c4eeeefedda7601eb4c78e;hp=e2c97bb7fcc0755f54115874179c63414ddfdfb8;hb=ab3134c16a7dfcdcb3a80483bf2e80c6e61f48f8;hpb=8895b3cb754738cb04bc9e4f9ce392d7812118c9 diff --git a/filestd.tex b/filestd.tex index e2c97bb..2a22545 100644 --- a/filestd.tex +++ b/filestd.tex @@ -353,8 +353,8 @@ ricchezza delle funzioni disponibili per le operazioni di lettura e scrittura sui file. Sono infatti previste ben tre diverse modalità modalità di input/output non formattato: \begin{enumerate} -\item\textsl{a blocchi} in cui legge/scrive un blocco di dati alla - volta, vedi \secref{sec:file_block_io}. +\item\textsl{binario} in cui legge/scrive un blocco di dati alla + volta, vedi \secref{sec:file_binary_io}. \item\textsl{di linea} in cui si legge/scrive una linea (terminata dal carattere di newline \verb|\n|) alla volta, vedi \secref{sec:file_line_io}. @@ -415,16 +415,70 @@ corretta la causa di un errore per evitare di mantenere i flag attivi, così da poter rilevare una successiva ulteriore condizione di errore. -\subsection{Input/output a blocchi} -\label{sec:file_block_io} +\subsection{Input/output binario} +\label{sec:file_binary_io} + +La prima modalità di input/output non formattato ricalca quella della +intefaccia dei file descriptor, e provvede semplicemente la scrittura e +la lettura dei dati da un buffer verso un file e vicecersa. In generale +questa è la modalità che si usa quando si ha a che fare con dati non +formattati. Le due funzioni che si usano per l'I/O binario sono: +\begin{functions} + \headdecl{stdio.h} + \funcdecl{size\_t fread(void * ptr, size\_t size, + size\_t nmemb, FILE * stream)} + \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}. + + 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 leggere o scrivere +un array o una struttura; un tipico esempio è quello in cui si salva una +parte di un vettore con una chiamata del tipo: +\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{} +int WriteVect(FILE * stream, double * vec, size_t nelem) +{ + int size, nread; + size = sizeof(*vec); + if ( (nread = fwrite(vec, size, nelem, stream)) != nelem) { + perror("Write error"); + } + return nread; +} +\end{lstlisting} +nel qual caso devono essere specificate dimensione e numero degli +elementi del vettore; nel caso di una struttura invece si avrà un +qualcosa tipo: +\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{} +struct histogram { + int nbins; + double max, min; + double * bin; +} histo; +int WriteStruct(FILE * stream, struct histogram * histo, size_t nelem) +{ + if ( fwrite(vec, sizeof(*histo), 1, stream) !=1) { + perror("Write error"); + } + return nread; +} +\end{lstlisting} + -La prima e più immediata forma di \subsection{Input/output a caratteri singoli} \label{sec:file_char_io} + + \subsection{Input/output di linea} \label{sec:file_line_io}