\chapter{I files: l'interfaccia standard C}
\label{cha:files_std_interface}

%
% Questa va per ultima. Va bene che e` la più usata, ma è basata sulle altre
%
\section{I file stream e gli oggetti \texttt{FILE}}
\label{sec:filestd_stream}

Esamineremo in questa sezione l'interfaccia per i file stream, le modalità per
crearli, e le funzioni disponibili per leggere, scrivere e compiere le varie
operazioni connesse all'uso dei file. L'interfaccia è accessibile includendo
l'header file \texttt{stdio.h}.

Per ragioni storiche la struttura di dati che rappresenta un stream è stata
chiamata \texttt{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 \texttt{FILE *} (tanto che in certi caso il termine di puntatore a
file è diventato sinonimo di stream). 

\subsection{Gli stream standard}
\label{sec:filestd_stdfiles}

Quando un programma viene lanciato il processo ha sempre tre stream
predefiniti aperti, che rappresentano i canali standard di input/output
prestabiliti per il processo; anche questi tre stream sono definiti
nell'header \texttt{stdio.h} e sono:

\begin{itemize}
\item \texttt{FILE * stdin} Lo \textit{standard input} cioè lo stream da cui
  il processo riceve ordinariamente i dati in ingresso. Normalmente è associato
  dalla shell all'input del terminale e prende i caratteri dalla tastiera.
\item \texttt{FILE * stdout} Lo \textit{standard input} 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 \texttt{FILE * stderr} Lo \textit{standard input} cioè lo stream su cui
  il processo è supposto inviare i messaaggi di errore. Normalmente anch'esso
  è associato dalla shell all'output del terminale e scrive sullo schermo.
\end{itemize}


\subsection{La bufferizzazione}
\label{sec:filestd_buffering}

\section{Funzioni base}
\label{sec:filestd_base_func}

\subsection{Apertura di uno stream}
\label{sec:filestd_open}

\subsection{Lettura e scrittura su uno stream}
\label{sec:filestd_io}

\subsection{Posizionamento su uno stream}
\label{sec:filestd_seek}

\subsection{Input/output binario}
\label{sec:filestd_binary_io}

\subsection{Input/output di linea}
\label{sec:filestd_line_io}

\subsection{Input/output formattato}
\label{sec:filestd_formatted_io}

\subsection{Chiusura di uno stream}
\label{sec:filestd_close}

\section{Funzioni avanzate}
\label{sec:filestd_adv_func}


\subsection{Dettagli dell'implementazione}
\label{sec:filestd_details}

\subsection{File temporanei}
\label{sec:filestd_details}

\subsection{Efficienza}
\label{sec:filestd_details}








