sufficiente a garantire la sincronizzazione.
Una volta aperto lo stream, si può cambiare la modalità di bufferizzazione
-(vedi \secref{sec:file_buffering_ctrl}) fintanto che non si è effettuato
+(si veda \secref{sec:file_buffering_ctrl}) fintanto che non si è effettuato
alcuna operazione di I/O sul file.
Uno stream viene chiuso con la funzione \func{fclose} il cui prototipo è:
\func{fflush}).}
\end{prototype}
-La funzione effettua uno scarico di tutti i dati presenti nei buffer di
-uscita e scarta tutti i dati in ingresso, se era stato allocato un
-buffer per lo stream questo verrà rilasciato. La funzione effettua lo
-scarico solo per i dati presenti nei buffer in user space usati dalle
-\acr{glibc}; se si vuole essere sicuri che il kernel forzi la scrittura
-su disco occorrerà effettuare una \func{sync}.
+La funzione effettua lo scarico di tutti i dati presenti nei buffer di uscita
+e scarta tutti i dati in ingresso; se era stato allocato un buffer per lo
+stream questo verrà rilasciato. La funzione effettua lo scarico solo per i
+dati presenti nei buffer in user space usati dalle \acr{glibc}; se si vuole
+essere sicuri che il kernel forzi la scrittura su disco occorrerà effettuare
+una \func{sync} (vedi \secref{sec:file_sync}).
Linux supporta, come estensione implementata dalle \acr{glibc}, anche una
altra funzione, \func{fcloseall}, che serve a chiudere tutti i file, il suo
Come per le funzioni di input/output a caratteri esistono le estensioni
per leggere e scrivere caratteri estesi, i loro prototipi sono:
\begin{functions}
- \headdecl{whar.h}
+ \headdecl{wchar.h}
\funcdecl{wchar\_t *fgetws(wchar\_t *ws, int n, FILE *stream)}
Legge un massimo di \param{n} caratteri estesi dal file
\param{stream} al buffer \param{ws}.
\func{fgets} non abbia i gravissimi problemi di \func{gets}, può
comunque dare risultati ambigui se l'input contiene degli zeri; questi
infatti saranno scritti sul buffer di uscita e la stringa in output
-apparirà come più corta dei bytes effettivamente letti. Questa è una
+apparirà come più corta dei byte effettivamente letti. Questa è una
condizione che è sempre possibile controllare (deve essere presente un
newline prima della effettiva conclusione della stringa presente nel
buffer), ma a costo di una complicazione ulteriore della logica del
\bodydesc{Le funzioni ritornano il numero di caratteri stampati.}
\end{functions}
\noindent le prime due servono per stampare su file (lo standard output
-o quallo specificato) la terza permette di stampare su una stringa, in
+o quello specificato) la terza permette di stampare su una stringa, in
genere l'uso di \func{sprintf} è sconsigliato in quanto è possibile, se
non si ha la sicurezza assoluta sulle dimensioni del risultato della
stampa, eccedere le dimensioni di \param{str}; per questo motivo si
\param{size} caratteri.
\end{prototype}
-La parte più complessa di queste funzioni è il formato della variabile
-\param{format} che indica le conversioni da fare ed il numero di
-parametri che dovranno essere specificati a seguire.
+La parte più complessa di queste funzioni è il formato della stringa
+\param{format} che indica le conversioni da fare, da cui poi deriva il numero
+dei parametri che dovranno essere passati a seguire. La stringa è costituita
+da caratteri normali (tutti eccetto \texttt{\%}), che vengono passati
+invariati all'output, e da direttive di conversione, in cui devono essere
+sempre presenti il carattere \texttt{\%}, che introduce la direttiva, ed uno
+degli specificatori di conversione (riportati in \ntab) che la conclude.
+\begin{table}[htb]
+ \centering
+ \begin{tabular}[c]{|l|l|p{10cm}|}
+ \hline
+ \textbf{Valore} & \textbf{Tipo} & \textbf{Significato} \\
+ \hline
+ \hline
+ \cmd{\%d} &\type{int} & Stampa un numero intero in formato decimale
+ con segno \\
+ \cmd{\%i} &\type{int} & Identico a \cmd{\%i} in output, \\
+ \cmd{\%o} &\type{unsigned int}& Stampa un numero intero come ottale\\
+ \cmd{\%u} &\type{unsigned int}& Stampa un numero intero in formato
+ decimale senza segno \\
+ \cmd{\%x},
+ \cmd{\%X} &\type{unsigned int}& Stampano un intero in formato esadecimale,
+ rispettivamente con lettere minuscole e
+ maiuscole. \\
+ \cmd{\%f} &\type{unsigned int}& Stampa un numero in virgola mobile con la
+ notazione a virgola fissa \\
+ \cmd{\%e},
+ \cmd{\%E} &\type{double} & Stampano un numero in virgola mobile con la
+ notazione esponenziale, rispettivamente con
+ lettere minuscole e maiuscole. \\
+ \cmd{\%g},
+ \cmd{\%G} &\type{double} & Stampano un numero in virgola mobile con la
+ notazione più appropriate delle due precedenti,
+ rispettivamente con lettere minuscole e
+ maiuscole. \\
+ \cmd{\%a},
+ \cmd{\%A} &\type{double} & Stampano un numero in virgola mobile in
+ notazione esadecimale frazionaria\\
+ \cmd{\%c} &\type{int} & Stampa un carattere singolo\\
+ \cmd{\%s} &\type{char *} & Stampa una stringa \\
+ \cmd{\%p} &\type{void *} & Stampa il valore di un puntatore\\
+ \cmd{\%n} &\type{\&int} & Prende il numero di caratteri stampati finora\\
+ \cmd{\%\%}& & Stampa un \% \\
+ \hline
+ \end{tabular}
+ \caption{Valori possibili per gli specificatori di conversione in una
+ stringa di formato di \func{printf}.}
+ \label{tab:file_format_spec}
+\end{table}
+Il formato di una direttiva di conversione prevede una serie di possibili
+elementi opzionali oltre al \cmd{\%} e allo specificatore di conversione; in
+generale essa è sempre del tipo:
+\begin{center}
+\begin{verbatim}
+% [n. parametro $] [flag] [[larghezza] [. precisione]] [tipo] conversione
+\end{verbatim}
+\end{center}
+in cui i valori opzionali sono indicati fra parentesi, e prevedono la
+presenza, in questo ordine, di: uno specificatore per il parametro da usare
+(terminato da un \cmd{\$}, uno o più flag (riassunti in
+\tabref{tab:file_format_flag}) che controllano il formato di stampa della
+conversione (riassunti in \tabref{tab:file_format_type}), uno specificatore di
+larghezza, eventualmente seguito (per i numeri in virgola mobile) da un
+specificatore di precisione, uno specificatore del tipo di dato (che ne indica
+la lunghezza).
+\begin{table}[htb]
+ \centering
+ \begin{tabular}[c]{|l|p{10cm}|}
+ \hline
+ \textbf{Valore} & \textbf{Significato}\\
+ \hline
+ \hline
+ \cmd{\#} & \\
+ \cmd{0} & \\
+ \cmd{-} & \\
+ \cmd{' '} & \\
+ \cmd{+} & \\
+ \hline
+ \end{tabular}
+ \caption{I valori dei flag per il formato di \func{printf}}
+ \label{tab:file_format_flag}
+\end{table}
+\begin{table}[htb]
+ \centering
+ \begin{tabular}[c]{|l|p{10cm}|}
+ \hline
+ \textbf{Valore} & \textbf{Significato} \\
+ \hline
+ \hline
+ \cmd{hh} & \\
+ \cmd{h} & \\
+ \cmd{l} & \\
+ \cmd{ll} & \\
+ \cmd{L} & \\
+ \cmd{q} & \\
+ \cmd{j} & \\
+ \cmd{z} & \\
+ \cmd{t} & \\
+ \hline
+ \end{tabular}
+ \caption{Il modificatore di tipo di dato per il formato di \func{printf}}
+ \label{tab:file_format_type}
+\end{table}
+
\label{sec:file_fseek}
Come per i file descriptor è possibile anche con gli stream spostarsi
-all'interno di un file per effettuare operazioni di lettura o scrittura
-in un punto prestabilito; questo fintanto che l'operazione di
-riposizionamento è supportata dal file sottostante lo stream, quando
-cioè si ha a che fare con quelio che viene detto un file ad
-\textsl{accesso casuale}.
+all'interno di un file per effettuare operazioni di lettura o scrittura in un
+punto prestabilito; questo fintanto che l'operazione di riposizionamento è
+supportata dal file sottostante lo stream, quando cioè si ha a che fare con
+quello che viene detto un file ad \textsl{accesso casuale}.
In GNU/Linux ed in generale in ogni sistema unix-like la posizione nel
file è espressa da un intero positivo, rappresentato dal tipo
un numero di caratteri (ad esempio in VMS può essere rappresentata come
numero di record, e offset rispetto al record corrente).
-Tutto questo comporta la presenza di diverse funzioni che seguono
+Tutto questo comporta la presenza di diverse funzioni che eseguono
sostanzialmente le stesse operazioni, ma usano parametri di tipo
diverso. Le funzioni tradizionali usate per il riposizionamento della
posizione in uno stream sono:
visti in \secref{sec:file_lseek}. La funzione restituisce 0 in caso di
successo e -1 in caso di errore.
-Per leggere la posizione corrente invece la funzione \func{ftell}, il
+Per leggere la posizione corrente si usa invece la funzione \func{ftell}, il
cui prototipo è:
\begin{prototype}{stdio.h}{long ftell(FILE *stream)}
Legge la posizione attuale nello stream.