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}.
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.
+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}
+
+
\subsection{Input/output a caratteri singoli}