X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filestd.tex;h=d5c5ce1fde5a42db471be139083d5ba3b7fe0a6a;hp=d69d7d42172d8ac3408681e8f1ec5eef98822cc6;hb=520fa6e7cd289a93a0955f3f91848ebd5b424250;hpb=a051e3c3d3b403ee210274d8c2ec7d756c531a21 diff --git a/filestd.tex b/filestd.tex index d69d7d4..d5c5ce1 100644 --- a/filestd.tex +++ b/filestd.tex @@ -1,6 +1,6 @@ %% 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", @@ -117,10 +117,7 @@ Nelle \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono 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}. @@ -487,40 +484,12 @@ In genere si usano queste funzioni quando si devono trasferire su file 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. @@ -906,14 +875,7 @@ e \var{*n} 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}.