Correzioni varie e riscrittura di parte del capitolo 2
[gapil.git] / filestd.tex
1  \chapter{I file: l'interfaccia standard ANSI C}
2 \label{cha:files_std_interface}
3
4 Esamineremo in questo capitolo l'interfaccia standard ANSI C per i file,
5 quella che viene comunemente detta interfaccia degli \textit{stream}.
6 Dopo una breve sezione introduttiva tratteremo le funzioni base per la
7 gestione dell'input/output, mentre tratteremo le caratteristiche più avanzate
8 dell'interfaccia nell'ultima sezione.
9
10
11 \section{Introduzione}
12 \label{sec:file_stream_intro}
13
14 Come visto in \capref{cha:file_unix_interface} le operazioni di I/O sui file
15 sono gestibili a basso livello con l'interfaccia standard unix, che ricorre
16 direttamente alle system call messe a disposizione dal kernel.
17
18 Questa interfaccia però non provvede le funzionalità previste dallo standard
19 ANSI C, che invece sono realizzate attraverso opportune funzioni di libreria,
20 queste, insieme alle altre funzioni definite dallo standard, vengono a
21 costituire il nucleo\footnote{queste funzioni sono state implementate la prima
22   volta da Ritchie nel 1976 e da allora sono rimaste sostanzialmente
23   immutate.} delle \acr{glibc}.
24
25
26 \subsection{I \textit{file stream}}
27 \label{sec:file_stream}
28
29 Come più volte ribadito l'interfaccia dei file descriptor è una interfaccia di
30 basso livello, che non provvede nessuna forma di formattazione dei dati e
31 nessuna forma di bufferizzazione per ottimizzare le operazioni di I/O.
32
33 In \textit{Advanced Programming in the Unix Environment} Stevens descrive una
34 serie di test sull'influenza delle dimensioni del blocco di dati (il parametro
35 \param{buf} di \func{read} e \func{write}) nell'efficienza nelle operazioni di
36 I/O con i file descriptor, evidenziando come le prestazioni ottimali si
37 ottengano a partire da dimensioni del buffer dei dati pari a quelle dei
38 blocchi del filesystem (il valore dato dal campo \var{st\_blksize} di
39 \var{fstat}).
40
41 Se il programmatore non si cura di effettuare le operazioni in blocchi di
42 dimensioni adeguate, le prestazioni sono inferiori.  La caratteristica
43 principale dell'interfaccia degli stream è che essa provvede da sola alla
44 gestione dei dettagli della bufferizzazione e all'esecuzione delle operazioni
45 di lettura e scrittura in blocchi di dimensioni appropriate all'ottenimento
46 della massima efficienza.
47
48 Per questo motivo l'interfaccia viene chiamata anche interfaccia dei
49 \textit{file stream}, dato che non è più necessario doversi preoccupare
50 dei dettagli della comunicazione con il tipo di hardware sottostante
51 (come nel caso della dimensione dei blocchi del filesystem), ed un file
52 può essere sempre considerato come composto da un flusso continuo (da
53 cui il nome \textit{stream}) di dati.
54
55 A parte i dettagli legati alla gestione delle operazioni di lettura e
56 scrittura (sia per quel che riguarda la bufferizzazione, che le
57 formattazioni), i file stream restano del tutto equivalenti ai file descriptor
58 (sui quali sono basati), ed in particolare continua a valere quanto visto in
59 \secref{sec:file_sharing} a proposito dell'accesso condiviso ed in
60 \secref{sec:file_access_control} per il controllo di accesso.
61
62
63 \subsection{Gli oggetti \type{FILE}}
64 \label{sec:file_FILE}
65
66 Per ragioni storiche la struttura di dati che rappresenta uno stream è stata
67 chiamata \type{FILE}, questi oggetti sono creati dalle funzioni di libreria e
68 contengono tutte le informazioni necessarie a gestire le operazioni sugli
69 stream, come la posizione corrente, lo stato del buffer e degli indicatori di
70 stato e di fine del file.
71
72 Per questo motivo gli utenti non devono mai utilizzare direttamente o
73 allocare queste strutture, ma usare sempre puntatori del tipo \type{FILE
74   *} ottenuti dalla libreria stessa (tanto che in certi casi il termine
75 di puntatore a file è diventato sinonimo di stream).  Tutte le funzioni
76 della libreria che operano sui file accettano come parametri solo
77 variabili di questo tipo, che diventa accessibile includendo l'header
78 file \file{stdio.h}.
79
80
81
82 \subsection{Gli stream standard}
83 \label{sec:file_std_stream}
84
85 Ai tre file descriptor standard (vedi \secref{sec:file_std_descr})
86 aperti per ogni processo, corrispondono altrettanti stream, che
87 rappresentano i canali standard di input/output prestabiliti; anche
88 questi tre stream sono identificabili attraverso dei nomi simbolici
89 definiti nell'header \file{stdio.h} che sono:
90
91 \begin{itemize}
92 \item \var{FILE *stdin} Lo \textit{standard input} cioè lo stream da
93   cui il processo riceve ordinariamente i dati in ingresso. Normalmente
94   è associato dalla shell all'input del terminale e prende i caratteri
95   dalla tastiera.
96 \item \var{FILE *stdout} Lo \textit{standard input} cioè lo stream su
97   cui il processo invia ordinariamente i dati in uscita. Normalmente è
98   associato dalla shell all'output del terminale e scrive sullo schermo.
99 \item \var{FILE *stderr} Lo \textit{standard input} cioè lo stream su
100   cui il processo è supposto inviare i messaggi di errore. Normalmente
101   anch'esso è associato dalla shell all'output del terminale e scrive
102   sullo schermo.
103 \end{itemize}
104
105 Nelle \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono
106 effettivamente tre variabili di tipo \type{FILE *} che possono essere
107 usate come tutte le altre, ad esempio si può effettuare una redirezione
108 dell'output di un programma con il semplice codice:
109 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
110     fclose (stdout);
111     stdout = fopen ("standard-output-file", "w");
112 \end{lstlisting}
113 ma in altri sistemi queste variabili possono essere definite da macro, e
114 se si hanno problemi di portabilità e si vuole essere sicuri, diventa
115 opportuno usare la funzione \func{freopen}.
116
117
118 \subsection{Le modalità di bufferizzazione}
119 \label{sec:file_buffering}
120
121 La bufferizzazione è una delle caratteristiche principali della
122 interfaccia degli stream; lo scopo è quello di ridurre al minimo il
123 numero di system call (\func{read} o \func{write}) eseguite nelle
124 operazioni di input/output. Questa funzionalità è assicurata
125 automaticamente dalla libreria, ma costituisce anche una degli aspetti
126 più comunemente fraintesi, in particolare per quello che riguarda
127 l'aspetto della scrittura dei dati sul file.
128
129 I caratteri che vengono scritti su uno stream normalmente vengono
130 accumulati in un buffer e poi trasmessi in blocco in maniera asincrona
131 rispetto alla scrittura (quello che viene chiamato lo \textsl{scarico}
132 dei dati, dall'inglese \textit{flush}) tutte le volte che il buffer
133 viene riempito. Un comportamento analogo avviene anche in lettura (cioè
134 dal file viene letto un blocco di dati, anche se se ne sono richiesti
135 una quantità inferiore), ma la cosa ovviamente ha rilevanza inferiore,
136 dato che i dati letti sono sempre gli stessi; in caso di scrittura
137 invece, quando si ha un accesso contemporaneo allo stesso file (ad
138 esempio da parte di un altro processo) si potranno vedere solo le parti
139 effettivamente scritte, e non quelle ancora presenti nel buffer.
140
141 Allo stesso modo, se si sta facendo dell'input/output interattivo
142 bisognerà tenere presente le caratteristiche delle operazioni di scarico
143 dei dati, poiché non è detto che ad una scrittura sullo stream
144 corrisponda una immediata scrittura sul dispositivo.
145
146 Per rispondere ad esigenze diverse, lo standard definisce tre distinte
147 modalità in cui può essere eseguita la bufferizzazione, delle quali
148 occorre essere ben consapevoli, specie in caso di lettura e scrittura da
149 dispositivi interattivi:
150 \begin{itemize}
151 \item \textit{unbuffered}: in questo caso non c'è bufferizzazione ed i
152   caratteri vengono trasmessi direttamente al file non appena possibile
153   (effettuando immediatamente una \func{write}).
154 \item \textit{line buffered}: in questo caso i caratteri vengono
155   normalmente trasmessi al file in blocco ogni volta che viene
156   incontrato un carattere di \textit{newline} (il carattere ASCII
157   \verb|\n|).
158 \item \textit{fully buffered}: in questo caso i caratteri vengono
159   trasmessi da e verso il file in blocchi di dimensione opportuna.
160 \end{itemize}
161
162 Lo standard ANSI C specifica inoltre che lo standard output e lo
163 standard input siano aperti in modalità \textit{fully buffered} quando
164 non fanno riferimento ad un dispositivo interattivo, e che lo standard
165 error non sia mai aperto in modalità \textit{fully buffered}.
166
167 Linux, come BSD e SVr4, specifica il comportamento di default in maniera
168 ancora più precisa, e cioè impone che lo standard error sia sempre
169 \textit{unbuffered} (in modo che i messaggi di errore siano mostrati il più
170 rapidamente possibile) e che standard input e standard output siano aperti in
171 modalità \textit{line buffered} quando sono associati ad un terminale (od
172 altro dispositivo interattivo) ed in modalità \textit{fully buffered}
173 altrimenti.
174
175 Il comportamento specificato per standard input e standard output vale anche
176 per tutti i nuovi stream aperti da un processo; la selezione comunque avviene
177 automaticamente, e la libreria apre lo stream nella modalità più opportuna a
178 seconda del file o del dispositivo scelto.
179
180 La modalità \textit{line buffered} è quella che necessita di maggiori
181 chiarimenti e attenzioni per quel che concerne il suo funzionamento. Come già
182 accennato nella descrizione, \emph{di norma} i dati vengono inviati al kernel
183 alla ricezione di un carattere di a capo; questo non è vero in tutti i casi,
184 infatti, dato che le dimensioni del buffer usato dalle librerie sono fisse, se
185 le si eccedono si può avere uno scarico dei dati anche prima che sia stato
186 inviato un carattere di \textit{newline}.
187
188 Un secondo punto da tenere presente, particolarmente quando si ha a che fare
189 con I/O interattivo, è che quando si effettua una lettura su uno stream che
190 comporta l'accesso al kernel\footnote{questo vuol dire sempre se lo stream da
191   cui si legge è in modalità \textit{unbuffered}.} viene anche eseguito lo
192 scarico di tutti i buffer degli stream in scrittura.
193
194 In \secref{sec:file_buffering_ctrl} vedremo come la libreria definisca delle
195 opportune funzioni per controllare le modalità di bufferizzazione e lo scarico
196 dei dati.
197
198
199
200 \section{Funzioni base}
201 \label{sec:file_ansi_base_func}
202
203 Esamineremo in questa sezione le funzioni base dell'interfaccia degli stream,
204 analoghe a quelle di \secref{sec:file_base_func} per i file descriptor. In
205 particolare vedremo come aprire, leggere, scrivere e cambiare la posizione
206 corrente in uno stream.
207
208
209 \subsection{Apertura e chiusura di uno stream}
210 \label{sec:file_fopen}
211
212 Le funzioni che si possono usare per aprire uno stream sono solo
213 tre\footnote{\func{fopen} e \func{freopen} fanno parte dello standard
214   ANSI C, \func{fdopen} è parte dello standard POSIX.1.}, i loro
215 prototipi sono:
216 \begin{functions}
217   \headdecl{stdio.h}
218   \funcdecl{FILE *fopen(const char *path, const char *mode)}
219   Apre il file specificato da \param{path}.
220   \funcdecl{FILE *fdopen(int fildes, const char *mode)}
221   Associa uno stream al file descriptor \param{fildes}.
222   \funcdecl{FILE *freopen(const char *path, const char *mode, FILE *stream)}
223   Apre il file specificato da \param{path} associandolo allo stream
224   specificato da \param{stream}, se questo è già aperto prima lo chiude.
225   
226   \bodydesc{Le funzioni ritornano un puntatore valido in caso di
227     successo e \macro{NULL} in caso di errore, in tal caso \var{errno}
228     viene settata al valore ricevuto dalla funzione sottostante di cui è
229     fallita l'esecuzione.
230   
231     Gli errori pertanto possono essere quelli di \func{malloc} per tutte
232     e tre le funzioni, quelli \func{open} per \func{fopen}, quelli di
233     \func{fcntl} per \func{fdopen} e quelli di \func{fopen},
234     \func{fclose} e \func{fflush} per \func{freopen}.}
235 \end{functions}
236
237 Normalmente la funzione che si usa per aprire uno stream è \func{fopen},
238 essa apre il file specificato nella modalità specificata da
239 \param{mode}, che è una stringa che deve iniziare con almeno uno dei
240 valori indicati in \tabref{tab:file_fopen_mode} (sono possibili varie
241 estensioni che vedremo in seguito).
242
243 L'uso più comune di \func{freopen} è per redirigere uno dei tre file
244 standard (vedi \secref{sec:file_std_stream}): il file \param{path} viene
245 associato a \param{stream} e se questo è uno stream già aperto viene
246 preventivamente chiuso.
247
248 Infine \func{fdopen} viene usata per associare uno stream ad un file
249 descriptor esistente ottenuto tramite una altra funzione (ad esempio con
250 una \func{open}, una \func{dup}, o una \func{pipe}) e serve quando si
251 vogliono usare gli stream con file come le fifo o i socket, che non
252 possono essere aperti con le funzioni delle librerie standard del C.
253
254 \begin{table}[htb]
255   \centering
256   \begin{tabular}[c]{|l|p{8cm}|}
257     \hline
258     \textbf{Valore} & \textbf{Significato}\\
259     \hline
260     \hline
261     \texttt{r} & Il file viene aperto, l'accesso viene posto in sola
262     lettura, lo stream è posizionato all'inizio del file.\\
263     \texttt{r+} & Il file viene aperto, l'accesso viene posto in lettura e
264     scrittura, lo stream è posizionato all'inizio del file. \\
265 %    \hline
266     \texttt{w} & Il file viene aperto e troncato a lunghezza nulla (o
267     creato se non esiste), l'accesso viene posto in sola scrittura, lo
268     stream è posizionato all'inizio del file.\\
269     \texttt{w+} & Il file viene aperto e troncato a lunghezza nulla (o
270     creato se non esiste), l'accesso viene posto in scrittura e lettura,
271     lo stream è posizionato all'inizio del file.\\
272 %    \hline
273     \texttt{a} & Il file viene aperto (o creato se non esiste) in
274     \textit{append mode}, l'accesso viene posto in sola scrittura. \\
275     \texttt{a+} & Il file viene aperto (o creato se non esiste) in
276     \textit{append mode}, l'accesso viene posto in lettura e scrittura. \\
277     \hline
278   \end{tabular}
279   \caption{Modalità di apertura di uno stream dello standard ANSI C che
280     sono sempre presenti in qualunque sistema POSIX}
281   \label{tab:file_fopen_mode}
282 \end{table}
283
284 In realtà lo standard ANSI C prevede un totale di 15 possibili valori
285 diversi per \param{mode}, ma in \tabref{tab:file_fopen_mode} si sono
286 riportati solo i sei valori effettivi, ad essi può essere aggiunto pure
287 il carattere \func{b} (come ultimo carattere o nel mezzo agli altri per
288 le stringhe di due caratteri) che in altri sistemi operativi serve a
289 distinguere i file binari dai file di testo; in un sistema POSIX questa
290 distinzione non esiste e il valore viene accettato solo per
291 compatibilità, ma non ha alcun effetto.
292
293 Le \acr{glibc} supportano alcune estensioni, queste devono essere sempre
294 indicate dopo aver specificato il \param{mode} con uno dei valori di
295 \tabref{tab:file_fopen_mode}. L'uso del carattere \texttt{x} serve per
296 evitare di sovrascrivere un file già esistente (è analoga all'uso
297 dell'opzione \macro{O\_EXCL} in \func{open}), se il file specificato già
298 esiste e si aggiunge questo carattere a \param{mode} la \func{fopen}
299 fallisce. 
300
301 Un'altra estensione serve a supportare la localizzazione, quando si
302 aggiunge a \param{mode} una stringa della forma \verb|",ccs=STRING"| il
303 valore \verb|STRING| è considerato il nome di una codifica dei caratteri
304 e \func{fopen} marca il file per l'uso dei caratteri estesi e abilita le
305 opportune funzioni di conversione in lettura e scrittura.
306
307 Inoltre nel caso si usi \func{fdopen} i valori specificati da
308 \param{mode} devono essere compatibili con quelli con cui il file
309 descriptor è stato aperto. Inoltre i modi \cmd{w} e \cmd{w+} non
310 troncano il file. La posizione nello stream viene settata a quella
311 corrente nel file descriptor, e le variabili di errore e di fine del
312 file (vedi \secref{sec:file_io}) sono cancellate. Il file non viene
313 duplicato e verrà chiuso alla chiusura dello stream.
314
315 I nuovi file saranno creati secondo quanto visto in
316 \secref{sec:file_ownership} ed avranno i permessi di accesso settati al
317 valore \macro{S\_IRUSR|S\_IWUSR|S\_IRGRP|S\_IWGRP|S\_IROTH|S\_IWOTH}
318 (pari a \macro{0666}) modificato secondo il valore di \acr{umask} per il
319 processo (si veda \secref{sec:file_umask}).
320
321 In caso di file aperti in lettura e scrittura occorre ricordarsi che c'è
322 di messo una bufferizzazione; per questo motivo lo standard ANSI C
323 richiede che ci sia una operazione di posizionamento fra una operazione
324 di output ed una di input o viceversa (eccetto il caso in cui l'input ha
325 incontrato la fine del file), altrimenti una lettura può ritornare anche
326 il risultato di scritture precedenti l'ultima effettuata. 
327
328 Per questo motivo è una buona pratica (e talvolta necessario) far seguire ad
329 una scrittura una delle funzioni \func{fflush}, \func{fseek}, \func{fsetpos} o
330 \func{rewind} prima di eseguire una rilettura; viceversa nel caso in cui si
331 voglia fare una scrittura subito dopo aver eseguito una lettura occorre prima
332 usare una delle funzioni \func{fseek}, \func{fsetpos} o \func{rewind}. Anche
333 una operazione nominalmente nulla come \func{fseek(file, 0, SEEK\_CUR)} è
334 sufficiente a garantire la sincronizzazione.
335
336 Una volta aperto lo stream, si può cambiare la modalità di bufferizzazione
337 (si veda \secref{sec:file_buffering_ctrl}) fintanto che non si è effettuato
338 alcuna operazione di I/O sul file.
339
340 Uno stream viene chiuso con la funzione \func{fclose} il cui prototipo è:
341 \begin{prototype}{stdio.h}{int fclose(FILE *stream)}
342   Chiude lo stream \param{stream}. 
343   
344   \bodydesc{Restituisce 0 in caso di successo e \macro{EOF} in caso di errore,
345     nel qual caso setta \var{errno} a \macro{EBADF} se il file descriptor
346     indicato da \param{stream} non è valido, o uno dei valori specificati
347     dalla sottostante funzione che è fallita (\func{close}, \func{write} o
348     \func{fflush}).}
349 \end{prototype}
350
351 La funzione effettua lo scarico di tutti i dati presenti nei buffer di uscita
352 e scarta tutti i dati in ingresso; se era stato allocato un buffer per lo
353 stream questo verrà rilasciato. La funzione effettua lo scarico solo per i
354 dati presenti nei buffer in user space usati dalle \acr{glibc}; se si vuole
355 essere sicuri che il kernel forzi la scrittura su disco occorrerà effettuare
356 una \func{sync} (vedi \secref{sec:file_sync}).
357
358 Linux supporta, come estensione implementata dalle \acr{glibc}, anche una
359 altra funzione, \func{fcloseall}, che serve a chiudere tutti i file, il suo
360 prototipo è:
361 \begin{prototype}{stdio.h}{int fcloseall(void)}
362   Chiude tutti gli stream. 
363   
364   \bodydesc{Restituisce 0 se non ci sono errori ed \macro{EOF} altrimenti.}
365 \end{prototype}
366 \noindent la funzione esegue lo scarico dei dati bufferizzati in uscita
367 e scarta quelli in ingresso, chiudendo tutti i file. Questa funzione è
368 provvista solo per i casi di emergenza, quando si è verificato un errore
369 ed il programma deve essere abortito, ma si vuole compiere qualche altra
370 operazione dopo aver chiuso i file e prima di uscire (si ricordi quanto
371 visto in \secref{sec:proc_exit}).
372
373
374 \subsection{Lettura e scrittura su uno stream}
375 \label{sec:file_io}
376
377 Una delle caratteristiche più utili dell'interfaccia degli stream è la
378 ricchezza delle funzioni disponibili per le operazioni di lettura e
379 scrittura sui file. Sono infatti previste ben tre diverse modalità
380 modalità di input/output non formattato:
381 \begin{enumerate*}
382 \item\textsl{binario} in cui legge/scrive un blocco di dati alla
383   volta, vedi \secref{sec:file_binary_io}.
384 \item\textsl{a caratteri} in cui si legge/scrive un carattere alla
385   volta (con la bufferizzazione gestita automaticamente dalla libreria),
386   vedi \secref{sec:file_char_io}.
387 \item\textsl{di linea} in cui si legge/scrive una linea (terminata dal
388   carattere di newline \verb|\n|) alla volta, vedi
389   \secref{sec:file_line_io}.
390 \end{enumerate*}
391 ed inoltre la modalità di input/output formattato.
392
393 A differenza dell'interfaccia dei file descriptor, con gli stream il
394 raggiungimento della fine del file è considerato un errore, e viene
395 notificato come tale dai valori di uscita delle varie funzioni. Nella
396 maggior parte dei casi questo avviene con la restituzione del valore
397 intero (di tipo \type{int}) \macro{EOF}\footnote{la costante deve essere
398   negativa, le \acr{glibc} usano -1, altre implementazioni possono avere
399   valori diversi.}  definito anch'esso nell'header \func{stdlib.h}.
400
401 Dato che le funzioni dell'interfaccia degli stream sono funzioni di libreria
402 che si appoggiano a delle system call, esse non settano direttamente la
403 variabile \var{errno}, che mantiene il valore settato dalla system call che ha
404 riportato l'errore. 
405
406 Siccome la condizione di end-of-file è anch'essa segnalata come errore, nasce
407 il problema di come distinguerla da un errore effettivo; basarsi solo sul
408 valore di ritorno della funzione e controllare il valore di \var{errno}
409 infatti non basta, dato che quest'ultimo potrebbe essere stato settato in una
410 altra occasione, (si veda \secref{sec:sys_errno} per i dettagli del
411 funzionamento di \var{errno}).
412
413 Per questo motivo tutte le implementazioni delle librerie standard
414 mantengono per ogni stream almeno due flag all'interno dell'oggetto
415 \type{FILE}, il flag di \textit{end-of-file}, che segnala che si è
416 raggiunta la fine del file in lettura, e quello di errore, che segnala
417 la presenza di un qualche errore nelle operazioni di input/output;
418 questi due flag possono essere riletti dalle funzioni:
419 \begin{functions}
420   \headdecl{stdio.h}
421   \funcdecl{int feof(FILE *stream)}
422   Controlla il flag di end-of-file di \param{stream}.
423   \funcdecl{int ferror(FILE *stream)}
424   Controlla il flag di errore di \param{stream}.
425   
426   \bodydesc{Entrambe le funzioni ritornano un valore diverso da zero se
427     i relativi flag sono settati.}
428 \end{functions}
429 \noindent si tenga presente comunque che la lettura di questi flag segnala
430 soltanto che c'è stato un errore, o che si è raggiunta la fine del file in una
431 qualunque operazione sullo stream, il controllo quindi deve essere effettuato
432 ogni volta che si chiama una funzione di libreria.
433
434 Entrambi i flag (di errore e di end-of-file) possono essere cancellati usando
435 la funzione \func{clearerr}, il cui prototipo è:
436 \begin{prototype}{stdio.h}{void clearerr(FILE *stream)}
437   Cancella i flag di errore ed end-of-file di \param{stream}. 
438 \end{prototype}
439 \noindent in genere si usa questa funziona una volta che si sia identificata e
440 corretta la causa di un errore per evitare di mantenere i flag attivi,
441 così da poter rilevare una successiva ulteriore condizione di errore.
442
443
444 \subsection{Input/output binario}
445 \label{sec:file_binary_io}
446
447 La prima modalità di input/output non formattato ricalca quella della
448 interfaccia dei file descriptor, e provvede semplicemente la scrittura e
449 la lettura dei dati da un buffer verso un file e viceversa. In generale
450 questa è la modalità che si usa quando si ha a che fare con dati non
451 formattati. Le due funzioni che si usano per l'I/O binario sono:
452 \begin{functions}
453   \headdecl{stdio.h} 
454   
455   \funcdecl{size\_t fread(void *ptr, size\_t size, size\_t nmemb, FILE
456     *stream)}
457   
458   \funcdecl{size\_t fwrite(const void *ptr, size\_t size, size\_t
459     nmemb, FILE *stream)}
460   
461   Rispettivamente leggono e scrivono \param{nmemb} elementi di dimensione
462   \param{size} dal buffer \param{ptr} al file \param{stream}.
463   
464   \bodydesc{Entrambe le funzioni ritornano il numero di elementi letti o
465     scritti, in caso di errore o fine del file viene restituito un numero di
466     elementi inferiore al richiesto.}
467 \end{functions}
468
469 In genere si usano queste funzioni quando si devono trasferire su file
470 blocchi di dati binari in maniera compatta e veloce; un primo caso di uso
471 tipico è quello in cui si salva un vettore (o un certo numero dei suoi
472 elementi) con una chiamata del tipo:
473 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
474 int WriteVect(FILE *stream, double *vec, size_t nelem) 
475 {
476     int size, nread;
477     size = sizeof(*vec);
478     if ( (nread = fwrite(vec, size, nelem, stream)) != nelem) {
479         perror("Write error");
480     }
481     return nread;
482 }
483 \end{lstlisting}
484 in questo caso devono essere specificate le dimensioni di ciascun
485 elemento ed il numero di quelli che si vogliono scrivere. Un secondo
486 caso è invece quello in cui si vuole trasferire su file una struttura;
487 si avrà allora una chiamata tipo:
488 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
489 struct histogram {
490     int nbins; 
491     double max, min;
492     double * bin;
493 } histo; 
494
495 int WriteStruct(FILE * stream, struct histogram * histo, size_t nelem) 
496 {
497     if ( fwrite(vec, sizeof(*histo), 1, stream) !=1) {
498         perror("Write error");
499     }
500     return nread;
501 }
502 \end{lstlisting}
503 in cui si specifica la dimensione dell'intera struttura ed un solo
504 elemento. 
505
506 In realtà quello che conta nel trasferimento dei dati sono le dimensioni
507 totali, che sono sempre pari al prodotto \func{size * nelem}; la sola
508 differenza è che le funzioni non ritornano il numero di byte scritti,
509 ma il numero di elementi.
510
511 La funzione \func{fread} legge sempre un numero intero di elementi, se
512 incontra la fine del file l'oggetto letto parzialmente viene scartato
513 (lo stesso avviene in caso di errore). In questo caso la posizione dello
514 stream viene settata alla fine del file (e non a quella corrispondente
515 alla quantità di dati letti).
516
517 In caso di errore (o fine del file per \func{fread}) entrambe le
518 funzioni restituiscono il numero di oggetti effettivamente letti o
519 scritti, che sarà inferiore a quello richiesto. Contrariamente a quanto
520 avviene per i file descriptor, questo segnala una condizione di errore e
521 occorrerà usare \func{feof} e \func{ferror} per stabilire la natura del
522 problema.
523
524 Benché queste funzioni assicurino la massima efficienza per il
525 salvataggio dei dati, i dati memorizzati attraverso di esse presentano
526 lo svantaggio di dipendere strettamente dalla piattaforma di sviluppo
527 usata ed in genere possono essere riletti senza problemi solo dallo
528 stesso programma che li ha prodotti.
529
530 Infatti diversi compilatori possono eseguire ottimizzazioni diverse
531 delle strutture dati e alcuni compilatori (come il \cmd{gcc}) possono
532 anche scegliere se ottimizzare l'occupazione di spazio, impacchettando
533 più strettamente i dati, o la velocità inserendo opportuni
534 \textit{padding} per l'allineamento dei medesimi generando quindi output
535 binari diversi. Inoltre altre incompatibilità si possono presentare
536 quando entrano in gioco differenze di architettura hardware, come la
537 dimensione del bus o la modalità di ordinamento dei bit o il formato
538 delle variabili in floating point.
539
540 Per questo motivo quando si usa l'input/output binario occorre sempre
541 essere prendere le opportune precauzioni (in genere usare un formato di
542 più alto livello che permetta di recuperare l'informazione completa),
543 per assicurarsi che versioni diverse del programma siano in grado di
544 rileggere i dati tenendo conto delle eventuali differenze.
545
546 Le \acr{glibc} definiscono altre due funzioni per l'I/O binario, che
547 evitano il lock implicito dello stream, usato per dalla librerie per la
548 gestione delle applicazioni multi-thread (si veda
549 \secref{sec:file_stream_thread} per i dettagli).
550
551 \begin{functions}
552   \headdecl{stdio.h} 
553   
554   \funcdecl{size\_t fread\_unlocked(void *ptr, size\_t size, size\_t
555     nmemb, FILE *stream)}
556   
557   \funcdecl{size\_t fwrite\_unlocked(const void *ptr, size\_t size,
558     size\_t nmemb, FILE *stream)}
559   
560   \bodydesc{Le funzioni sono identiche alle analoghe \func{fread} e
561     \func{fwrite} ma non acquisiscono il lock implicito sullo stream.}
562 \end{functions}
563 \noindent entrambe le funzioni sono estensioni GNU previste solo dalle
564 \acr{glibc}.
565
566
567 \subsection{Input/output a caratteri}
568 \label{sec:file_char_io}
569
570 La seconda modalità di input/output è quella a caratteri, in cui si
571 trasferisce un carattere alla volta.  Le funzioni per la lettura a
572 caratteri sono tre, \func{fgetc}, \func{getc} e \func{getchar}, i
573 rispettivi prototipi sono:
574 \begin{functions}
575   \headdecl{stdio.h} 
576
577   \funcdecl{int getc(FILE *stream)} Legge un byte da \param{stream} e lo
578   restituisce come intero. In genere è implementata come una macro. 
579
580   \funcdecl{int fgetc(FILE *stream)} Legge un byte da \param{stream} e lo
581   restituisce come intero. È una sempre una funzione.
582   
583   \funcdecl{int getchar(void)} Equivalente a \func{getc(stdin)}.
584   
585   \bodydesc{Tutte queste funzioni leggono un byte alla volta, che viene
586     restituito come intero; in caso di errore o fine del file il valore
587     di ritorno è \macro{EOF}.}
588 \end{functions}
589
590 A parte \func{getchar}, che si usa in genere per leggere un carattere da
591 tastiera, le altre due funzioni sono sostanzialmente equivalenti. La
592 differenza è che \func{gets} è ottimizzata al massimo e normalmente
593 viene implementata con una macro, per cui occorre stare attenti a cosa
594 le si passa come argomento, infatti \param{stream} può essere valutato
595 più volte nell'esecuzione, e non viene passato in copia con il
596 meccanismo visto in \secref{sec:proc_var_passing}; per questo motivo se
597 si passa una espressione si possono avere effetti indesiderati.
598
599 Invece \func{fgets} è assicurata essere sempre una funzione, per questo
600 motivo la sua esecuzione normalmente è più lenta per via dell'overhead
601 della chiamata, ma è altresì possibile ricavarne l'indirizzo, che può
602 essere passato come parametro ad un altra funzione (e non si hanno i
603 problemi accennati in precedenza con \param{stream}).
604
605 Le tre funzioni restituiscono tutte un \type{unsigned char} convertito
606 ad \type{int} (si usa \type{unsigned char} in modo da evitare
607 l'espansione del segno). In questo modo il valore di ritorno è sempre
608 positivo, tranne in caso di errore o fine del file.
609
610 Nelle estensioni GNU che provvedono la localizzazione sono definite tre
611 funzioni equivalenti alle precedenti che invece di un carattere di un
612 byte restituiscono un carattere in formato esteso (cioè di tipo
613 \type{wint\_t}, il loro prototipo è:
614 \begin{functions}
615   \headdecl{stdio.h} 
616   \headdecl{wchar.h} 
617   
618   \funcdecl{wint\_t getwc(FILE *stream)} Legge un carattere esteso da
619   \param{stream}. In genere è implementata come una macro.
620   
621   \funcdecl{wint\_t fgetwc(FILE *stream)} Legge un carattere esteso da
622   \param{stream} È una sempre una funzione.
623   
624   \funcdecl{wint\_t getwchar(void)} Equivalente a \func{getwc(stdin)}.
625   
626   \bodydesc{Tutte queste funzioni leggono un carattere alla volta, in
627     caso di errore o fine del file il valore di ritorno è \macro{WEOF}.}
628 \end{functions}
629
630 Per scrivere un carattere si possono usare tre funzioni analoghe alle
631 precedenti usate per leggere: \func{putc}, \func{fputc} e
632 \func{putchar}; i loro prototipi sono:
633 \begin{functions}
634   \headdecl{stdio.h} 
635   
636   \funcdecl{int putc(int c, FILE *stream)} Scrive il carattere \param{c}
637   su \param{stream}. In genere è implementata come una macro.
638   
639   \funcdecl{int fputc(FILE *stream)} Scrive il carattere \param{c} su
640   \param{stream}. È una sempre una funzione.
641   
642   \funcdecl{int putchar(void)} Equivalente a \func{putc(stdin)}.
643   
644   \bodydesc{Le funzioni scrivono sempre un carattere alla volta, il cui
645     valore viene restituito in caso di successo; in caso di errore o
646     fine del file il valore di ritorno è \macro{EOF}.}
647 \end{functions}
648
649 Tutte queste funzioni scrivono sempre un byte alla volta, anche se
650 prendono come parametro un \type{int} (che pertanto deve essere ottenuto
651 con un cast da un \type{unsigned char}). Anche il valore di ritorno è
652 sempre un intero; in caso di errore o fine del file il valore di ritorno
653 è \macro{EOF}.
654
655 Come nel caso dell'I/O binario le \acr{glibc} provvedono per ciascuna
656 delle funzioni precedenti, come estensione GNU, una seconda funzione, il
657 cui nome è ottenuto aggiungendo un \func{\_unlocked}, che esegue
658 esattamente le stesse operazioni evitando però il lock implicito dello
659 stream.
660
661 Per compatibilità con SVID sono provviste anche due funzioni per leggere
662 e scrivere una \textit{word} (che è sempre definita come \type{int}); i
663 loro prototipi sono:
664 \begin{functions}
665   \headdecl{stdio.h} 
666   
667   \funcdecl{int getw(FILE *stream)} Legge una parola da \param{stream}.
668   \funcdecl{int putw(int w, FILE *stream)} Scrive la parola \param{w} su
669   \param{stream}.
670   
671   \bodydesc{Le funzioni restituiscono la parola \param{w}, o \macro{EOF}
672     in caso di errore o di fine del file.}
673 \end{functions}
674 \noindent l'uso di queste funzioni è deprecato in favore dell'uso di
675 \func{fread} e \func{fwrite}, in quanto non è possibile distinguere il
676 valore -1 da una condizione di errore che restituisce \macro{EOF}.
677
678 Una degli usi più frequenti dell'input/output a caratteri è nei
679 programmi di \textit{parsing} in cui si analizza il testo; in questo
680 contesto diventa utile poter analizzare il carattere successivo da uno
681 stream senza estrarlo effettivamente (la tecnica è detta \textit{peeking
682   ahead}) in modo che il programma possa regolarsi sulla base avendo
683 dato una \textsl{sbirciatina} a quello che viene dopo. 
684
685 Nel nostro caso questo tipo di comportamento può essere realizzato prima
686 leggendo il carattere, e poi rimandandolo indietro, cosicché ridiventi
687 disponibile per una lettura successiva; la funzione che inverte la
688 lettura si chiama \func{ungetc} ed il suo prototipo è:
689 \begin{prototype}{stdio.h}{int ungetc(int c, FILE *stream)}
690   Rimanda indietro il carattere \param{c}, con un cast a \type{unsigned
691     char}, sullo stream \param{stream}.
692
693   \bodydesc{La funzione ritorna \param{c} in caso di successo e
694   \macro{EOF} in caso di errore.}
695 \end{prototype}
696 \noindent benché lo standard ANSI C preveda che l'operazione possa
697 essere ripetuta per un numero arbitrario di caratteri, alle
698 implementazioni è richiesto di garantire solo un livello; questo è
699 quello che fa la \acr{glibc}, che richiede che avvenga un'altra
700 operazione fra due \func{ungetc} successive.
701
702 Non è necessario che il carattere che si manda indietro sia l'ultimo che
703 si è letto, e non è necessario neanche avere letto nessun carattere
704 prima di usare \func{ungetc}, ma di norma la funzione è intesa per
705 essere usata per rimandare indietro l'ultimo carattere letto.
706
707 Nel caso \param{c} sia un \macro{EOF} la funzione non fa nulla, e
708 restituisce sempre \macro{EOF}; così si può usare \func{ungetc} anche
709 con il risultato di una lettura alla fine del file.
710
711 Se si è alla fine del file si può comunque rimandare indietro un
712 carattere, il flag di end-of-file verrà automaticamente cancellato
713 perché c'è un nuovo carattere disponibile che potrà essere riletto
714 successivamente.
715
716 Infine si tenga presente che \func{ungetc} non altera il contenuto del
717 file, ma opera esclusivamente sul buffer interno. Se si esegue una
718 qualunque delle operazioni di riposizionamento (vedi
719 \secref{sec:file_fseek}) i caratteri rimandati indietro vengono
720 scartati.
721
722
723 \subsection{Input/output di linea}
724 \label{sec:file_line_io}
725
726 La terza ed ultima modalità di input/output non formattato è quella di
727 linea, in cui legge o scrive una riga alla volta; questa è una modalità
728 molto usata per l'I/O da terminale, ma che presenta le caratteristiche
729 più controverse.
730
731 Le funzioni previste dallo standard ANSI C per leggere una linea sono
732 sostanzialmente due, \func{gets} e \func{fgets}, i cui rispettivi
733 prototipi sono:
734 \begin{functions}
735   \headdecl{stdio.h} 
736   
737   \funcdecl{char *gets(char *string)} Scrive su \param{string} una
738   linea letta da \var{stdin}.
739   
740   \funcdecl{char *fgets(char *string, int size, FILE *stream)}
741   Scrive su \param{string} la linea letta da \param{stream} per un
742   massimo di \param{size} byte.
743   
744   \bodydesc{Le funzioni restituiscono l'indirizzo \param{string} in caso
745     di successo o \macro{NULL} in caso di errore.}
746 \end{functions}
747
748 Entrambe le funzioni effettuano la lettura (dal file specificato
749 \func{fgets}, dallo standard input \func{gets}) di una linea di
750 caratteri (terminata dal carattere \textit{newline}, \verb|\n|), ma
751 \func{gets} sostituisce \verb|\n| con uno zero, mentre \func{fgets}
752 aggiunge uno zero dopo il \textit{newline}, che resta dentro la
753 stringa. Se la lettura incontra la fine del file (o c'è un errore) viene
754 restituito un \macro{NULL}, ed il buffer \param{buf} non viene toccato.
755
756 L'uso di \func{gets} è deprecato e deve essere assolutamente evitato; la
757 funzione infatti non controlla il numero di byte letti, per cui nel caso
758 la stringa letta superi le dimensioni del buffer, si avrà un
759 \textit{buffer overflow}, con sovrascrittura della memoria del processo
760 adiacente al buffer. 
761
762 Questa è una delle vulnerabilità più sfruttate per guadagnare accessi
763 non autorizzati al sistema (i cosiddetti \textit{exploit}), basta
764 infatti inviare una stringa sufficientemente lunga ed opportunamente
765 forgiata per sovrascrivere gli indirizzi di ritorno nello stack
766 (supposto che la \func{gets} sia stata chiamata da una subroutine), in
767 modo da far ripartire l'esecuzione nel codice inviato nella stringa
768 stessa (in genere uno \textit{shell code} cioè una sezione di programma
769 lancia una shell).
770
771 La funzione \func{fgets} non ha i precedenti problemi di \func{gets} in
772 quanto prende in input la dimensione del buffer \param{size}, che non
773 verrà mai ecceduta in lettura. La funzione legge fino ad un massimo di
774 \param{size} caratteri (newline compreso), ed aggiunge uno zero di
775 terminazione; questo comporta che la stringa possa essere al massimo di
776 \var{size-1} caratteri.  Se la linea eccede la dimensione del buffer
777 verranno letti solo \var{size-1} caratteri, ma la stringa sarà sempre
778 terminata correttamente con uno zero finale; sarà possibile leggere i
779 restanti caratteri in una chiamata successiva.
780
781 Per la scrittura di una linea lo standard ANSI C prevede altre due
782 funzioni, \func{fputs} e \func{puts}, analoghe a quelle di lettura, i
783 rispettivi prototipi sono:
784 \begin{functions}
785   \headdecl{stdio.h} 
786   
787   \funcdecl{int puts(const char *string)} Scrive su \var{stdout} la
788   linea \param{string}.
789   
790   \funcdecl{int fputs(const char *string, FILE *stream)} Scrive su
791   \param{stream} la linea \param{string}.
792   
793   \bodydesc{Le funzioni restituiscono un valore non negativo in caso di
794     successo o \macro{EOF} in caso di errore.}
795 \end{functions}
796
797 Dato che in questo caso si scrivono i dati in uscita \func{puts} non ha
798 i problemi di \func{gets} ed è in genere la forma più immediata per
799 scrivere messaggi sullo standard output; la funzione prende una stringa
800 terminata da uno zero ed aggiunge automaticamente un newline. La
801 differenza con \func{fputs} (a parte la possibilità di specificare un
802 file diverso da \var{stdout}) è che quest'ultima non aggiunge il
803 newline, che deve essere previsto esplicitamente. 
804
805 Come per le funzioni di input/output a caratteri esistono le estensioni
806 per leggere e scrivere caratteri estesi, i loro prototipi sono:
807 \begin{functions}
808   \headdecl{wchar.h} 
809   \funcdecl{wchar\_t *fgetws(wchar\_t *ws, int n, FILE *stream)}
810   Legge un massimo di \param{n} caratteri estesi dal file
811   \param{stream} al buffer \param{ws}.
812   
813   \funcdecl{int fputws(const wchar\_t *ws, FILE *stream)} Scrive la
814   linea \param{ws} di caratteri estesi sul file \param{stream}.
815   
816   \bodydesc{Le funzioni ritornano rispettivamente \param{ws} o un numero
817     non negativo in caso di successo e \macro{NULL} o \macro{EOF} in
818     caso di errore o fine del file.}
819 \end{functions}
820 \noindent il comportamento è identico a quello di \func{fgets} e
821 \func{fputs} solo che tutto (numero di caratteri massimo, terminatore
822 della stringa, newline) è espresso in termini di caratteri estesi
823 anziché di caratteri ASCII.
824
825 Come nel caso dell'I/O binario e a caratteri nelle \acr{glibc} sono
826 previste una serie di altre funzioni, estensione di tutte quelle
827 illustrate finora (eccetto \func{gets} e \func{puts}), il cui nome si
828 ottiene aggiungendo un \func{\_unlocked}, e che eseguono esattamente le
829 stesse operazioni delle loro equivalenti, evitando però il lock
830 implicito dello stream (vedi \secref{sec:file_stream_thread}).
831
832 Come abbiamo visto, le funzioni di lettura per l'input/output di linea
833 previste dallo standard ANSI C presentano svariati inconvenienti. Benché
834 \func{fgets} non abbia i gravissimi problemi di \func{gets}, può
835 comunque dare risultati ambigui se l'input contiene degli zeri; questi
836 infatti saranno scritti sul buffer di uscita e la stringa in output
837 apparirà come più corta dei byte effettivamente letti. Questa è una
838 condizione che è sempre possibile controllare (deve essere presente un
839 newline prima della effettiva conclusione della stringa presente nel
840 buffer), ma a costo di una complicazione ulteriore della logica del
841 programma. Lo stesso dicasi quando si deve gestire il caso di stringa
842 che eccede le dimensioni del buffer.
843
844 Per questo motivo le \acr{glibc} prevedono, come estensione GNU, due
845 nuove funzioni per la gestione dell'input/output di linea, il cui uso
846 permette di risolvere questi problemi. L'uso di queste funzioni deve
847 essere attivato definendo la macro \macro{\_GNU\_SOURCE} prima di
848 includere \file{stdio.h}. La prima delle due, \func{getline}, serve per
849 leggere una linea terminata da un newline esattamente allo stesso modo
850 di \func{fgets}, il suo prototipo è:
851 \begin{prototype}{stdio.h}
852   {ssize\_t getline(char **buffer, size\_t *n, FILE *stream)} Legge una
853   linea dal file \param{stream} sul buffer indicato da \param{buffer}
854   riallocandolo se necessario (l'indirizzo del buffer e la sua
855   dimensione vengono sempre riscritte).
856
857   \bodydesc{La funzione ritorna il numero di caratteri letti in caso di
858   successo e -1 in caso di errore o di raggiungimento della fine del
859   file.}
860 \end{prototype}
861
862 La funzione permette di eseguire una lettura senza doversi preoccupare
863 della eventuale lunghezza eccessiva della stringa da leggere. Essa
864 prende come primo parametro l'indirizzo del puntatore al buffer su cui
865 si vuole leggere la linea. Quest'ultimo \emph{deve} essere stato
866 allocato in precedenza con una \func{malloc} (non si può passare
867 l'indirizzo di un puntatore ad una variabile locale); come secondo
868 parametro la funzione vuole l'indirizzo della variabile contenente le
869 dimensioni del buffer suddetto.
870
871 Se il buffer di destinazione è sufficientemente ampio la stringa viene
872 scritta subito, altrimenti il buffer viene allargato usando
873 \func{realloc} e la nuova dimensione ed il nuovo puntatore vengono
874 passata indietro (si noti infatti come per entrambi i parametri si siano
875 usati dei \textit{value result argument}, passando dei puntatori anzichè
876 i valori delle variabili, secondo la tecnica spiegata in
877 \secref{sec:proc_var_passing}).
878
879 Se si passa alla funzione l'indirizzo ad un puntatore settato a
880 \macro{NULL} e \var{*n} è zero, la funzione provvede da sola
881 all'allocazione della memoria necessaria a contenere la linea. In tutti
882 i casi si ottiene dalla funzione un puntatore all'inizio del testo della
883 linea. Un esempio di codice può essere il seguente:
884 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
885     size_t n = 0; 
886     char *ptr = NULL;
887     int nread;
888     FILE * file;
889     ...    
890     nread = getline(&ptr, &n, file);
891 \end{lstlisting}
892 e per evitare memory leak occorre ricordarsi di liberare \var{ptr} con
893 una \func{free}.
894
895 Il valore di ritorno della funzione indica il numero di caratteri letti
896 dallo stream (quindi compreso il newline, ma non lo zero di
897 terminazione); questo permette anche di distinguere eventuali zeri letti
898 dallo stream da quello inserito dalla funzione per terminare la linea.
899 Se si è alla fine del file e non si è potuto leggere nulla o c'è stato
900 un errore la funzione restituisce -1.
901
902 La seconda estensione GNU è una generalizzazione di \func{getline} per
903 poter usare come separatore un carattere qualsiasi, la funzione si
904 chiama \func{getdelim} ed il suo prototipo è:
905 \begin{prototype}{stdio.h}
906 {ssize\_t getdelim(char **buffer, size\_t *n, int delim, FILE *stream)} 
907   Identica a \func{getline} solo che usa \param{delim} al posto del
908   carattere di newline come separatore di linea.
909 \end{prototype}
910
911 Il comportamento di \func{getdelim} è identico a quello di
912 \func{getline} (che può essere implementata da questa passando
913 \verb|'\n'| come valore di \param{delim}).
914
915
916 \subsection{Input/output formattato}
917 \label{sec:file_formatted_io}
918
919 L'ultima modalità di input/output è quella formattata, che è una delle
920 caratteristiche più utilizzate delle librerie standard del C; in genere
921 questa è la modalità in cui si esegue normalmente l'output su terminale
922 poichè permette di stampare in maniera facile e veloce dati, tabelle e
923 messaggi.
924
925 L'output formattato viene eseguito con una delle 13 funzioni della
926 famiglia \func{printf}; le tre più usate sono le seguenti:
927 \begin{functions}
928   \headdecl{stdio.h} 
929   \funcdecl{int printf(const char *format, ...)} Stampa su \var{stdout}
930   gli argomenti, secondo il formato specificato da \param{format}.
931   
932   \funcdecl{int fprintf(FILE *stream, const char *format, ...)}  Stampa
933   su \param{stream} gli argomenti, secondo il formato specificato da
934   \param{format}.
935   
936   \funcdecl{int sprintf(char *str, const char *format, ...)} Stampa
937   sulla stringa \param{str} gli argomenti, secondo il formato
938   specificato da \param{format}.
939
940   \bodydesc{Le funzioni ritornano il numero di caratteri stampati.}
941 \end{functions}
942 \noindent le prime due servono per stampare su file (lo standard output
943 o quello specificato) la terza permette di stampare su una stringa, in
944 genere l'uso di \func{sprintf} è sconsigliato in quanto è possibile, se
945 non si ha la sicurezza assoluta sulle dimensioni del risultato della
946 stampa, eccedere le dimensioni di \param{str}; per questo motivo si
947 consiglia l'uso dell'alternativa:
948 \begin{prototype}{stdio.h}
949 {snprintf(char *str, size\_t size, const char *format, ...);} 
950   Identica a \func{sprintf}, ma non scrive su \param{str} più di
951   \param{size} caratteri.
952 \end{prototype}
953
954 La parte più complessa di queste funzioni è il formato della stringa
955 \param{format} che indica le conversioni da fare, da cui poi deriva il numero
956 dei parametri che dovranno essere passati a seguire. La stringa è costituita
957 da caratteri normali (tutti eccetto \texttt{\%}), che vengono passati
958 invariati all'output, e da direttive di conversione, in cui devono essere
959 sempre presenti il carattere \texttt{\%}, che introduce la direttiva, ed uno
960 degli specificatori di conversione (riportati in \ntab) che la conclude. 
961
962 \begin{table}[htb]
963   \centering
964   \begin{tabular}[c]{|l|l|p{10cm}|}
965     \hline
966     \textbf{Valore} & \textbf{Tipo} & \textbf{Significato} \\
967     \hline
968     \hline
969    \cmd{\%d} &\type{int}         & Stampa un numero intero in formato decimale
970                                    con segno \\
971    \cmd{\%i} &\type{int}         & Identico a \cmd{\%i} in output, \\
972    \cmd{\%o} &\type{unsigned int}& Stampa un numero intero come ottale\\
973    \cmd{\%u} &\type{unsigned int}& Stampa un numero intero in formato
974                                    decimale senza segno \\
975    \cmd{\%x}, 
976    \cmd{\%X} &\type{unsigned int}& Stampano un intero in formato esadecimale,
977                                    rispettivamente con lettere minuscole e
978                                    maiuscole. \\
979    \cmd{\%f} &\type{unsigned int}& Stampa un numero in virgola mobile con la
980                                    notazione a virgola fissa \\
981    \cmd{\%e}, 
982    \cmd{\%E} &\type{double} & Stampano un numero in virgola mobile con la
983                               notazione esponenziale, rispettivamente con
984                               lettere minuscole e maiuscole. \\
985    \cmd{\%g}, 
986    \cmd{\%G} &\type{double} & Stampano un numero in virgola mobile con la
987                               notazione più appropriate delle due precedenti,
988                               rispettivamente con lettere minuscole e
989                               maiuscole. \\
990    \cmd{\%a}, 
991    \cmd{\%A} &\type{double} & Stampano un numero in virgola mobile in
992                               notazione esadecimale frazionaria\\
993    \cmd{\%c} &\type{int}    & Stampa un carattere singolo\\
994    \cmd{\%s} &\type{char *} & Stampa una stringa \\
995    \cmd{\%p} &\type{void *} & Stampa il valore di un puntatore\\
996    \cmd{\%n} &\type{\&int}  & Prende il numero di caratteri stampati finora\\
997    \cmd{\%\%}&              & Stampa un \% \\
998     \hline
999   \end{tabular}
1000   \caption{Valori possibili per gli specificatori di conversione in una
1001     stringa di formato di \func{printf}.} 
1002   \label{tab:file_format_spec}
1003 \end{table}
1004
1005
1006 Il formato di una direttiva di conversione prevede una serie di possibili
1007 elementi opzionali oltre al \cmd{\%} e allo specificatore di conversione; in
1008 generale essa è sempre del tipo:
1009 \begin{center}
1010 \begin{verbatim}
1011 % [n. parametro $] [flag] [[larghezza] [. precisione]] [tipo] conversione
1012 \end{verbatim}
1013 \end{center}
1014 in cui i valori opzionali sono indicati fra parentesi, e prevedono la
1015 presenza, in questo ordine, di: uno specificatore per il parametro da usare
1016 (terminato da un \cmd{\$}, uno o più flag (riassunti in
1017 \tabref{tab:file_format_flag}) che controllano il formato di stampa della
1018 conversione (riassunti in \tabref{tab:file_format_type}), uno specificatore di
1019 larghezza, eventualmente seguito (per i numeri in virgola mobile) da un
1020 specificatore di precisione, uno specificatore del tipo di dato (che ne indica
1021 la lunghezza).
1022
1023 \begin{table}[htb]
1024   \centering
1025   \begin{tabular}[c]{|l|p{10cm}|}
1026     \hline
1027     \textbf{Valore} & \textbf{Significato}\\
1028     \hline
1029     \hline
1030     \cmd{\#}  & \\
1031     \cmd{0}   & \\
1032     \cmd{-}   & \\
1033     \cmd{' '} & \\
1034     \cmd{+}   & \\
1035     \hline
1036   \end{tabular}
1037   \caption{I valori dei flag per il formato di \func{printf}}
1038   \label{tab:file_format_flag}
1039 \end{table}
1040
1041
1042
1043 \begin{table}[htb]
1044   \centering
1045   \begin{tabular}[c]{|l|p{10cm}|}
1046     \hline
1047     \textbf{Valore} & \textbf{Significato} \\
1048     \hline
1049     \hline
1050     \cmd{hh} & \\
1051     \cmd{h}  & \\
1052     \cmd{l}  & \\
1053     \cmd{ll} & \\
1054     \cmd{L}  & \\
1055     \cmd{q}  & \\
1056     \cmd{j}  & \\
1057     \cmd{z}  & \\
1058     \cmd{t}  & \\
1059     \hline
1060   \end{tabular}
1061   \caption{Il modificatore di tipo di dato per il formato di \func{printf}}
1062   \label{tab:file_format_type}
1063 \end{table}
1064
1065
1066
1067
1068
1069 \subsection{Posizionamento su uno stream}
1070 \label{sec:file_fseek}
1071
1072 Come per i file descriptor è possibile anche con gli stream spostarsi
1073 all'interno di un file per effettuare operazioni di lettura o scrittura in un
1074 punto prestabilito; questo fintanto che l'operazione di riposizionamento è
1075 supportata dal file sottostante lo stream, quando cioè si ha a che fare con
1076 quello che viene detto un file ad \textsl{accesso casuale}.
1077
1078 In GNU/Linux ed in generale in ogni sistema unix-like la posizione nel
1079 file è espressa da un intero positivo, rappresentato dal tipo
1080 \type{off\_t}, il problema è alcune delle funzioni usate per il
1081 riposizionamento sugli stream originano dalle prime versioni di unix in
1082 cui questo tipo non era ancora stato definito, e che in altri sistemi
1083 non è detto che la posizione su un file venga sempre rappresentata con
1084 un numero di caratteri (ad esempio in VMS può essere rappresentata come
1085 numero di record, e offset rispetto al record corrente).
1086
1087 Tutto questo comporta la presenza di diverse funzioni che eseguono
1088 sostanzialmente le stesse operazioni, ma usano parametri di tipo
1089 diverso. Le funzioni tradizionali usate per il riposizionamento della
1090 posizione in uno stream sono:
1091 \begin{functions}
1092   \headdecl{stdio.h} 
1093   
1094   \funcdecl{int fseek(FILE *stream, long offset, int whence)} Sposta la
1095   posizione nello stream secondo quanto specificato tramite \param{offset}
1096   e \param{whence}.  
1097
1098   \funcdecl{void rewind(FILE *stream)} Riporta la posizione nello stream
1099   all'inizio del file.
1100 \end{functions}
1101
1102 L'uso di \func{fseek} è del tutto analogo a quello di \func{lseek} per i
1103 file descriptor, ed i parametri, a parte il tipo, hanno lo stesso
1104 significato; in particolare \param{whence} assume gli stessi valori già
1105 visti in \secref{sec:file_lseek}. La funzione restituisce 0 in caso di
1106 successo e -1 in caso di errore. 
1107
1108 Per leggere la posizione corrente si usa invece la funzione \func{ftell}, il
1109 cui prototipo è:
1110 \begin{prototype}{stdio.h}{long ftell(FILE *stream)} 
1111   Legge la posizione attuale nello stream.
1112   
1113   \bodydesc{La funzione restituisce la posizione corrente, o -1 in caso
1114     di fallimento, che può esser dovuto sia al fatto che il file non
1115     supporta il riposizionamento che al fatto che la posizione non può
1116     essere espressa con un \type{long int}}
1117 \end{prototype}
1118
1119   
1120
1121
1122 \section{Funzioni avanzate}
1123 \label{sec:file_stream_adv_func}
1124
1125 In questa sezione esamineremo le funzioni che permettono di controllare
1126 alcune caratteristiche più particolari degli stream, come la lettura
1127 degli attributi, le modalità di bufferizzazione, etc.
1128
1129
1130 \subsection{Le funzioni di controllo}
1131 \label{sec:file_stream_cntrl}
1132
1133 Al contrario di quanto avviene con i file descriptor le librerie standard del
1134 C non prevedono nessuna funzione come la \func{fcntl} per la lettura degli
1135 attributi degli stream; le \acr{glibc} però supportano alcune estensioni
1136 derivate da Solaris, che permettono di ottenere informazioni utili.
1137
1138 In certi casi può essere necessario sapere se un certo stream è accessibile in
1139 lettura o scrittura. In genere questa informazione non è disponibile, e si
1140 deve ricordare come il file è stato aperto. La cosa può essere complessa se le
1141 operazioni vengono effettuate in una subroutine, che a questo punto
1142 necessiterà di informazioni aggiuntive rispetto al semplice puntatore allo
1143 stream; questo può essere evitato con le due funzioni \func{\_\_freadable} e
1144 \func{\_\_fwritable} i cui prototipi sono:
1145 \begin{functions}
1146   \headdecl{stdio\_ext.h}
1147   \funcdecl{int \_\_freadable (FILE *stream)}
1148   Restituisce un valore diverso da zero se \param{stream} consente la lettura.
1149
1150   \funcdecl{int \_\_fwritable(FILE *stream)}  
1151   Restituisce un valore diverso da zero se \param{stream} consente la
1152   scrittura.
1153 \end{functions}
1154
1155 Altre due funzioni, \func{\_\_freading} e \func{\_\_fwriting} servono ad un
1156 uso ancora più specialistico, il loro prototipo è: 
1157 \begin{functions}
1158   \headdecl{stdio\_ext.h}
1159   \funcdecl{int \_\_freading (FILE *stream)}
1160   Restituisce un valore diverso da zero se \param{stream} è aperto in sola
1161   lettura o se l'ultima operazione è stata di lettura.
1162
1163   \funcdecl{int \_\_fwriting(FILE *stream)}  
1164   Restituisce un valore diverso da zero se \param{stream} è aperto in sola
1165   scrittura o se l'ultima operazione è stata di scrittura.
1166 \end{functions}
1167
1168 Le due funzioni hanno lo scopo di determinare di che tipo è stata l'ultima
1169 operazione eseguita su uno stream aperto in lettura/scrittura; ovviamente se
1170 uno stream è aperto in sola lettura (o sola scrittura) la modalità dell'ultima
1171 operazione è sempre determinata; l'unica ambiguità è quando non sono state
1172 ancora eseguite operazioni, in questo caso le funzioni rispondono come se
1173 una operazione ci fosse comunque stata.
1174
1175 La conoscenza dell'ultima operazione effettuata su uno stream aperto in
1176 lettura/scrittura è utile in quanto permette di trarre conclusioni sullo stato
1177 del buffer e del suo contenuto.
1178
1179
1180 \subsection{Il controllo della bufferizzazione}
1181 \label{sec:file_buffering_ctrl}
1182
1183 Come accennato in \secref{sec:file_buffering} le librerie definiscono una
1184 serie di funzioni che permettono di controllare il comportamento degli
1185 stream; se non si è 
1186
1187
1188 \subsection{Gli stream e i thread}
1189 \label{sec:file_stream_thread}
1190
1191 Gli stream possono essere usati in applicazioni multi-thread allo stesso
1192 modo in cui sono usati nelle applicazioni normali, ma si deve essere
1193 consapevoli delle possibili complicazioni anche quando non si usano i
1194 thread, dato che l'implementazione delle librerie è influenzata
1195 pesantemente dalle richieste necessarie per garantirne l'uso coi thread.
1196
1197
1198
1199 \begin{functions}
1200   \headdecl{stdio.h}
1201   
1202   \funcdecl{void flockfile(FILE *stream)} Esegue l'acquisizione del
1203   lock dello stream \param{stream}, bloccandosi in caso il lock non
1204   disponibile. 
1205   
1206   \funcdecl{int ftrylockfile(FILE *stream)} Tenta l'acquisizione del
1207   lock dello stream \param{stream}, senza bloccarsi in caso il lock non sia
1208   disponibile. Ritorna zero in caso di acquisizione del lock, diverso da
1209   zero altrimenti.
1210   
1211   \funcdecl{void funlockfile(FILE *stream)} Rilascia il lock dello
1212   stream \param{stream}.
1213 \end{functions}
1214
1215
1216 \subsection{Dettagli dell'implementazione}
1217 \label{sec:file_stream_details}
1218
1219
1220 \subsection{File temporanei}
1221 \label{sec:file_temp_file}
1222
1223
1224 \subsection{Efficienza}
1225 \label{sec:file_stream_efficiency}
1226