X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filestd.tex;h=c189164ceefd7685c65ca99256c3269ffbb63f1d;hp=8645c5db210a07c06e6b648a0f6ad0843f37316b;hb=dcf2c2df897955ff3503a7c426025457ab456fd7;hpb=94b4d603807121b40eef06d22d2b6cd6e06ec7fd diff --git a/filestd.tex b/filestd.tex index 8645c5d..c189164 100644 --- a/filestd.tex +++ b/filestd.tex @@ -1,6 +1,6 @@ %% filestd.tex %% -%% Copyright (C) 2000-2011 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2012 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -92,7 +92,7 @@ usare sempre puntatori del tipo \texttt{FILE *} ottenuti dalla libreria stessa (tanto che in certi casi il termine di puntatore a file è diventato sinonimo di \textit{stream}). Tutte le funzioni della libreria che operano sui file accettano come argomenti solo variabili di questo tipo, che diventa -accessibile includendo l'header file \file{stdio.h}. +accessibile includendo l'header file \headfile{stdio.h}. \subsection{Gli \textit{stream standard}} @@ -102,7 +102,7 @@ Ai tre file descriptor standard (vedi sez.~\ref{sec:file_std_descr}) aperti per ogni processo, corrispondono altrettanti \textit{stream}, che rappresentano i canali standard di input/output prestabiliti; anche questi tre \textit{stream} sono identificabili attraverso dei nomi simbolici definiti -nell'header \file{stdio.h} che sono: +nell'header \headfile{stdio.h} che sono: \begin{basedescript}{\desclabelwidth{3.0cm}} \item[\var{FILE *stdin}] Lo \textit{standard input} cioè il \textit{file @@ -422,7 +422,7 @@ 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 \ctyp{int}) \val{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}. + valori diversi.} definito anch'esso nell'header \headfile{stdlib.h}. Dato che le funzioni dell'interfaccia degli \textit{stream} sono funzioni di libreria che si appoggiano a delle system call, esse non impostano @@ -460,13 +460,13 @@ effettuato ogni volta che si chiama una funzione di libreria. Entrambi i flag (di errore e di end-of-file) possono essere cancellati usando la funzione \funcd{clearerr}, il cui prototipo è: \begin{prototype}{stdio.h}{void clearerr(FILE *stream)} - Cancella i flag di errore ed end-of-file di \param{stream}. + Cancella i flag di errore ed \textit{end-of-file} di \param{stream}. \end{prototype} \noindent in genere si usa questa funzione una volta che si sia identificata e corretta la causa di un errore per evitare di mantenere i flag attivi, così da poter rilevare una successiva ulteriore condizione di errore. Di questa -funzione esiste una analoga \func{clearerr\_unlocked} che non esegue il blocco -dello \textit{stream} (vedi sez.~\ref{sec:file_stream_thread}). +funzione esiste una analoga \funcm{clearerr\_unlocked} che non esegue il +blocco dello \textit{stream} (vedi sez.~\ref{sec:file_stream_thread}). \subsection{Input/output binario} @@ -854,9 +854,10 @@ che eccede le dimensioni del buffer. Per questo motivo le \acr{glibc} prevedono, come estensione GNU, due nuove funzioni per la gestione dell'input/output di linea, il cui uso permette di risolvere questi problemi. L'uso di queste funzioni deve essere attivato -definendo la macro \macro{\_GNU\_SOURCE} prima di includere \file{stdio.h}. La -prima delle due, \funcd{getline}, serve per leggere una linea terminata da un -newline, esattamente allo stesso modo di \func{fgets}, il suo prototipo è: +definendo la macro \macro{\_GNU\_SOURCE} prima di includere +\headfile{stdio.h}. La prima delle due, \funcd{getline}, serve per leggere una +linea terminata da un newline, esattamente allo stesso modo di \func{fgets}, +il suo prototipo è: \begin{prototype}{stdio.h} {ssize\_t getline(char **buffer, size\_t *n, FILE *stream)} Legge una linea dal file \param{stream} copiandola sul buffer indicato da \param{buffer} @@ -1165,8 +1166,10 @@ inoltre ricordarsi di invocare \func{free} per liberare detto puntatore quando la stringa non serve più, onde evitare \itindex{memory~leak} \textit{memory leak}. -Infine una ulteriore estensione GNU definisce le due funzioni \func{dprintf} e -\func{vdprintf}, che prendono un file descriptor al posto dello +% TODO verificare se mettere prototipi di \func{dprintf} e \func{vdprintf} + +Infine una ulteriore estensione GNU definisce le due funzioni \funcm{dprintf} e +\funcm{vdprintf}, che prendono un file descriptor al posto dello \textit{stream}. Altre estensioni permettono di scrivere con caratteri estesi. Anche queste funzioni, il cui nome è generato dalle precedenti funzioni aggiungendo una \texttt{w} davanti a \texttt{print}, sono trattate in @@ -1194,8 +1197,8 @@ famiglia \func{scanf}; fra queste le tre più importanti sono \funcd{scanf}, di errore o fine del file viene invece restituito \val{EOF}.} \end{functions} \noindent e come per le analoghe funzioni di scrittura esistono le relative -\func{vscanf}, \func{vfscanf} \func{vsscanf} che usano un puntatore ad una -lista di argomenti. +\funcm{vscanf}, \funcm{vfscanf} e \funcm{vsscanf} che usano un puntatore ad +una lista di argomenti. Tutte le funzioni della famiglia delle \func{scanf} vogliono come argomenti i puntatori alle variabili che dovranno contenere le conversioni; questo è un @@ -1323,6 +1326,7 @@ gran parte dei casi un intero a 32 bit, questo diventa un problema quando la posizione sul file viene espressa con un valore a 64 bit come accade nei sistemi più moderni. +% TODO: mettere prototipi espliciti fseeko e ftello o menzione? \section{Funzioni avanzate} @@ -1433,11 +1437,11 @@ stato allocato e rimanere disponibile per tutto il tempo in cui si opera sullo \textit{stream}. In genere conviene allocarlo con \func{malloc} e disallocarlo dopo la chiusura del file; ma fintanto che il file è usato all'interno di una funzione, può anche essere usata una \index{variabili!automatiche} variabile -automatica. In \file{stdio.h} è definita la macro \const{BUFSIZ}, che indica -le dimensioni generiche del buffer di uno \textit{stream}; queste vengono -usate dalla funzione \func{setbuf}. Non è detto però che tale dimensione -corrisponda sempre al valore ottimale (che può variare a seconda del -dispositivo). +automatica. In \headfile{stdio.h} è definita la macro \const{BUFSIZ}, che +indica le dimensioni generiche del buffer di uno \textit{stream}; queste +vengono usate dalla funzione \func{setbuf}. Non è detto però che tale +dimensione corrisponda sempre al valore ottimale (che può variare a seconda +del dispositivo). Dato che la procedura di allocazione manuale è macchinosa, comporta dei rischi (come delle scritture accidentali sul buffer) e non assicura la scelta delle @@ -1525,6 +1529,8 @@ scelta, si può forzare lo scarico dei dati sul file con la funzione \macro{\_SVID\_SOURCE} o \macro{\_GNU\_SOURCE}.} che non effettua il blocco dello stream. +% TODO aggiungere prototipo \func{fflush\_unlocked}? + Se \param{stream} è \val{NULL} lo scarico dei dati è forzato per tutti gli \textit{stream} aperti. Esistono però circostanze, ad esempio quando si vuole essere sicuri che sia stato eseguito tutto l'output su terminale, in cui serve @@ -1643,6 +1649,9 @@ con \param{type}, che può essere uno dei seguenti: di blocco dello \textit{stream}. \end{basedescript} +% TODO trattare \func{clearerr\_unlocked} + + \itindend{thread}