From: Simone Piccardi Date: Tue, 4 Dec 2001 23:14:57 +0000 (+0000) Subject: I/O binario continua X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=ab3134c16a7dfcdcb3a80483bf2e80c6e61f48f8 I/O binario continua --- diff --git a/filestd.tex b/filestd.tex index f93b9e0..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,12 +415,62 @@ 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. +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} diff --git a/gapil.tex b/gapil.tex index 5262399..b24b29f 100644 --- a/gapil.tex +++ b/gapil.tex @@ -1,4 +1,4 @@ -%% +%% %% GaPiL : Guida alla Programmazione in Linux %% %% S. Piccardi Oct. 2000