%% filestd.tex
%%
-%% Copyright (C) 2000-2002 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2003 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Prefazione",
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}[stepnumber=0,frame=]{}
- fclose(stdout);
- stdout = fopen("standard-output-file", "w");
-\end{lstlisting}
+\includecodesnip{listati/redir_stdout.c}
ma in altri sistemi queste variabili possono essere definite da macro, e
se si hanno problemi di portabilità e si vuole essere sicuri, diventa
opportuno usare la funzione \func{freopen}.
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
-\begin{lstlisting}[stepnumber=0,frame=]{}
-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}
-%\normalsize
+\includecodesnip{listati/WriteVect.c}
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
-\begin{lstlisting}[stepnumber=0,frame=]{}
-struct histogram {
- int nbins;
- double max, min;
- double *bin;
-} histo;
-
-int WriteStruct(FILE *stream, struct histogram *histo)
-{
- if ( fwrite(histo, sizeof(*histo), 1, stream) !=1) {
- perror("Write error");
- }
- return nread;
-}
-\end{lstlisting}
-%\normalsize
+\includecodesnip{listati/WriteStruct.c}
in cui si specifica la dimensione dell'intera struttura ed un solo
elemento.
necessaria a contenere la linea. In tutti i casi si ottiene dalla funzione un
puntatore all'inizio del testo della linea letta. Un esempio di codice può
essere il seguente:
-\begin{lstlisting}[stepnumber=0,frame=]{}
- size_t n = 0;
- char *ptr = NULL;
- int nread;
- FILE * file;
- ...
- nread = getline(&ptr, &n, file);
-\end{lstlisting}
+\includecodesnip{listati/getline.c}
e per evitare memory leak\index{memory leak} occorre ricordarsi di liberare
\var{ptr} con una \func{free}.