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{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, il cui formato è sempre
-del tipo:
+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
+% [n. parametro $] [flag] [[larghezza] [. precisione]] [tipo] conversione
\end{verbatim}
\end{center}
-in cui devono essere sempre presenti il carattere \texttt{\%}, che introduce
-la direttiva, ed uno degli specificatori di conversione (riportatati in \ntab)
-che la conclude; gli altri valori, indicati fra parentesi, sono opzionali.
+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} \\
+ \textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \cmd{\%d} & Stampa un numero intero in formato decimale
- con segno\\
- \cmd{\%i} & Identico a \cmd{\%i} in output, \\
- \cmd{\%o} & Stampa un numero intero come ottale\\
- \cmd{\%u} & Stampa un numero intero in formato decimale senza
- segno \\
- \cmd{\%x}, \cmd{\%X} & Stampano un intero in formato esadecimale,
- rispettivamente con lettere minuscole e maiuscole. \\
- \cmd{\%f} & Stampa un numero in virgola mobile con la notazione
- a virgola fissa \\
- \cmd{\%e}, \cmd{\%E} & Stampano un numero in virgola mobile con la notazione
- esponenziale, rispettivamente con lettere minuscole
- e maiuscole. \\
- \cmd{\%g}, \cmd{\%G} & Stampano un numero in virgola mobile con la notazione
- più appropriate delle due precedenti,
- rispettivamente con lettere minuscole e maiuscole. \\
- \cmd{\%a}, \cmd{\%A} & Stampano un numero in virgola mobile in notazione
- esadecimale frazionaria\\
- \cmd{\%c} & Stampa un carattere singolo\\
- \cmd{\%s} & Stampa una stringa \\
- \cmd{\%p} & Stampa il valore di un puntatore\\
- \cmd{\%n} & Prende il numero di caratteri stampati finora\\
+ \cmd{\#} & \\
+ \cmd{0} & \\
+ \cmd{-} & \\
+ \cmd{' '} & \\
+ \cmd{+} & \\
\hline
\end{tabular}
- \caption{Valori possibili per gli specificatori di conversione in una
- stringa di formato per l'output.}
- \label{tab:file_format_spec}
+ \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