\subsection{I \textit{file stream}}
\label{sec:file_stream}
-Come più volte ribadito l'interfaccia dei file descriptor è una interfaccia di
+Come più volte ribadito l'interfaccia dei file descriptor è un'interfaccia di
basso livello, che non provvede nessuna forma di formattazione dei dati e
nessuna forma di bufferizzazione per ottimizzare le operazioni di I/O.
\secref{sec:file_access_control} per il controllo di accesso.
-\subsection{Gli oggetti \type{FILE}}
+\subsection{Gli oggetti \ctyp{FILE}}
\label{sec:file_FILE}
Per ragioni storiche la struttura di dati che rappresenta uno stream è stata
-chiamata \type{FILE}, questi oggetti sono creati dalle funzioni di libreria e
+chiamata \ctyp{FILE}, questi oggetti sono creati dalle funzioni di libreria e
contengono tutte le informazioni necessarie a gestire le operazioni sugli
stream, come la posizione corrente, lo stato del buffer e degli indicatori di
stato e di fine del file.
Per questo motivo gli utenti non devono mai utilizzare direttamente o
-allocare queste strutture, ma usare sempre puntatori del tipo \type{FILE
+allocare queste strutture, ma usare sempre puntatori del tipo \ctyp{FILE
*} ottenuti dalla libreria stessa (tanto che in certi casi il termine
di puntatore a file è diventato sinonimo di stream). Tutte le funzioni
della libreria che operano sui file accettano come parametri solo
cui il processo riceve ordinariamente i dati in ingresso. Normalmente
è associato dalla shell all'input del terminale e prende i caratteri
dalla tastiera.
-\item[\var{FILE *stdout}] Lo \textit{standard input} cioè lo stream su
+\item[\var{FILE *stdout}] Lo \textit{standard output} cioè lo stream su
cui il processo invia ordinariamente i dati in uscita. Normalmente è
associato dalla shell all'output del terminale e scrive sullo schermo.
-\item[\var{FILE *stderr}] Lo \textit{standard input} cioè lo stream su
+\item[\var{FILE *stderr}] Lo \textit{standard error} cioè lo stream su
cui il processo è supposto inviare i messaggi di errore. Normalmente
anch'esso è associato dalla shell all'output del terminale e scrive
sullo schermo.
\end{basedescript}
Nelle \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono
-effettivamente tre variabili di tipo \type{FILE *} che possono essere
+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}[labelstep=0,frame=,indent=1cm]{}
interfaccia degli stream; lo scopo è quello di ridurre al minimo il
numero di system call (\func{read} o \func{write}) eseguite nelle
operazioni di input/output. Questa funzionalità è assicurata
-automaticamente dalla libreria, ma costituisce anche una degli aspetti
+automaticamente dalla libreria, ma costituisce anche uno degli aspetti
più comunemente fraintesi, in particolare per quello che riguarda
l'aspetto della scrittura dei dati sul file.
\hline
\end{tabular}
\caption{Modalità di apertura di uno stream dello standard ANSI C che
- sono sempre presenti in qualunque sistema POSIX}
+ sono sempre presenti in qualunque sistema POSIX.}
\label{tab:file_fopen_mode}
\end{table}
processo (si veda \secref{sec:file_umask}).
In caso di file aperti in lettura e scrittura occorre ricordarsi che c'è
-di messo una bufferizzazione; per questo motivo lo standard ANSI C
+di mezzo una bufferizzazione; per questo motivo lo standard ANSI C
richiede che ci sia un'operazione di posizionamento fra un'operazione
di output ed una di input o viceversa (eccetto il caso in cui l'input ha
incontrato la fine del file), altrimenti una lettura può ritornare anche
raggiungimento della fine del file è considerato un errore, e viene
notificato come tale dai valori di uscita delle varie funzioni. Nella
maggior parte dei casi questo avviene con la restituzione del valore
-intero (di tipo \type{int}) \macro{EOF}\footnote{la costante deve essere
+intero (di tipo \ctyp{int}) \macro{EOF}\footnote{la costante deve essere
negativa, le \acr{glibc} usano -1, altre implementazioni possono avere
valori diversi.} definito anch'esso nell'header \file{stdlib.h}.
Per questo motivo tutte le implementazioni delle librerie standard
mantengono per ogni stream almeno due flag all'interno dell'oggetto
-\type{FILE}, il flag di \textit{end-of-file}, che segnala che si è
+\ctyp{FILE}, il flag di \textit{end-of-file}, che segnala che si è
raggiunta la fine del file in lettura, e quello di errore, che segnala
la presenza di un qualche errore nelle operazioni di input/output;
questi due flag possono essere riletti dalle funzioni:
le si passa come argomento, infatti \param{stream} può essere valutato
più volte nell'esecuzione, e non viene passato in copia con il
meccanismo visto in \secref{sec:proc_var_passing}; per questo motivo se
-si passa una espressione si possono avere effetti indesiderati.
+si passa un'espressione si possono avere effetti indesiderati.
Invece \func{fgetc} è assicurata essere sempre una funzione, per questo
motivo la sua esecuzione normalmente è più lenta per via dell'overhead
essere passato come parametro ad un altra funzione (e non si hanno i
problemi accennati in precedenza con \param{stream}).
-Le tre funzioni restituiscono tutte un \type{unsigned char} convertito
-ad \type{int} (si usa \type{unsigned char} in modo da evitare
+Le tre funzioni restituiscono tutte un \ctyp{unsigned char} convertito
+ad \ctyp{int} (si usa \ctyp{unsigned char} in modo da evitare
l'espansione del segno). In questo modo il valore di ritorno è sempre
positivo, tranne in caso di errore o fine del file.
Nelle estensioni GNU che provvedono la localizzazione sono definite tre
funzioni equivalenti alle precedenti che invece di un carattere di un
byte restituiscono un carattere in formato esteso (cioè di tipo
-\type{wint\_t}, il loro prototipo è:
+\ctyp{wint\_t}, il loro prototipo è:
\begin{functions}
\headdecl{stdio.h}
\headdecl{wchar.h}
\end{functions}
Tutte queste funzioni scrivono sempre un byte alla volta, anche se
-prendono come parametro un \type{int} (che pertanto deve essere ottenuto
-con un cast da un \type{unsigned char}). Anche il valore di ritorno è
+prendono come parametro un \ctyp{int} (che pertanto deve essere ottenuto
+con un cast da un \ctyp{unsigned char}). Anche il valore di ritorno è
sempre un intero; in caso di errore o fine del file il valore di ritorno
è \macro{EOF}.
stream.
Per compatibilità con SVID sono provviste anche due funzioni per leggere
-e scrivere una \textit{word} (che è sempre definita come \type{int}); i
+e scrivere una \textit{word} (che è sempre definita come \ctyp{int}); i
loro prototipi sono:
\begin{functions}
\headdecl{stdio.h}
disponibile per una lettura successiva; la funzione che inverte la
lettura si chiama \func{ungetc} ed il suo prototipo è:
\begin{prototype}{stdio.h}{int ungetc(int c, FILE *stream)}
- Rimanda indietro il carattere \param{c}, con un cast a \type{unsigned
+ Rimanda indietro il carattere \param{c}, con un cast a \ctyp{unsigned
char}, sullo stream \param{stream}.
\bodydesc{La funzione ritorna \param{c} in caso di successo e
\textbf{Valore} & \textbf{Tipo} & \textbf{Significato} \\
\hline
\hline
- \cmd{\%d} &\type{int} & Stampa un numero intero in formato decimale
+ \cmd{\%d} &\ctyp{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
+ \cmd{\%i} &\ctyp{int} & Identico a \cmd{\%i} in output, \\
+ \cmd{\%o} &\ctyp{unsigned int}& Stampa un numero intero come ottale\\
+ \cmd{\%u} &\ctyp{unsigned int}& Stampa un numero intero in formato
decimale senza segno \\
\cmd{\%x},
- \cmd{\%X} &\type{unsigned int}& Stampano un intero in formato esadecimale,
+ \cmd{\%X} &\ctyp{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
+ \cmd{\%f} &\ctyp{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
+ \cmd{\%E} &\ctyp{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
+ \cmd{\%G} &\ctyp{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
+ \cmd{\%A} &\ctyp{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{\%c} &\ctyp{int} & Stampa un carattere singolo\\
+ \cmd{\%s} &\ctyp{char *} & Stampa una stringa \\
+ \cmd{\%p} &\ctyp{void *} & Stampa il valore di un puntatore\\
+ \cmd{\%n} &\ctyp{\&int} & Prende il numero di caratteri stampati finora\\
\cmd{\%\%}& & Stampa un \% \\
\hline
\end{tabular}
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \cmd{hh} & una conversione intera corrisponde a un \type{char} con o senza
+ \cmd{hh} & una conversione intera corrisponde a un \ctyp{char} con o senza
segno, o il puntatore per il numero dei parametri \cmd{n} è di
- tipo \type{char}.\\
- \cmd{h} & una conversione intera corrisponde a uno \type{short} con o
+ tipo \ctyp{char}.\\
+ \cmd{h} & una conversione intera corrisponde a uno \ctyp{short} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
- è di tipo \type{short}.\\
- \cmd{l} & una conversione intera corrisponde a un \type{long} con o
+ è di tipo \ctyp{short}.\\
+ \cmd{l} & una conversione intera corrisponde a un \ctyp{long} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
- è di tipo \type{long}, o il carattere o la stringa seguenti
+ è di tipo \ctyp{long}, o il carattere o la stringa seguenti
sono in formato esteso.\\
- \cmd{ll} & una conversione intera corrisponde a un \type{long long} con o
+ \cmd{ll} & una conversione intera corrisponde a un \ctyp{long long} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
- è di tipo \type{long long}.\\
+ è di tipo \ctyp{long long}.\\
\cmd{L} & una conversione in virgola mobile corrisponde a un
- \type{double}.\\
+ \ctyp{double}.\\
\cmd{q} & sinonimo di \cmd{ll}.\\
\cmd{j} & una conversione intera corrisponde a un \type{intmax\_t} o
\type{uintmax\_t}.\\
l'indirizzo di un puntatore ad una stringa di caratteri, in cui verrà
restituito (si ricordi quanto detto in \secref{sec:proc_var_passing} a
proposito dei \textit{value result argument}) l'indirizzo della stringa
-allogata automaticamente dalle funzioni. Occorre inoltre ricordarsi di
+allocata automaticamente dalle funzioni. Occorre inoltre ricordarsi di
invocare \func{free} per liberare detto puntatore quando la stringa non serve
più, onde evitare memory leak.
\bodydesc{La funzione restituisce la posizione corrente, o -1 in caso
di fallimento, che può esser dovuto sia al fatto che il file non
supporta il riposizionamento che al fatto che la posizione non può
- essere espressa con un \type{long int}}
+ essere espressa con un \ctyp{long int}}
\end{prototype}
\noindent la funzione restituisce la posizione come numero di byte
dall'inizio dello stream.
In Linux, a partire dalle glibc 2.1, sono presenti anche le due funzioni
\func{fseeko} e \func{ftello}, che assolutamente identiche alle precedenti
\func{fseek} e \func{ftell} ma hanno argomenti di tipo \type{off\_t} anziché
-di tipo \type{long int}.
+di tipo \ctyp{long int}.