X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filestd.tex;h=14867d51305f3577f41127638d4698390ee0e167;hp=9094ab3c98de33a77d7ea5adc4202020d9923d01;hb=b9ab696dcd693cb09fb09be5065f487c814c6f03;hpb=0c7fb286c2c1b480ed81f7ce8d506b179e5d291e diff --git a/filestd.tex b/filestd.tex index 9094ab3..14867d5 100644 --- a/filestd.tex +++ b/filestd.tex @@ -608,7 +608,7 @@ ad \type{int} (si usa \type{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 estenzioni GNU che provvedono la localizzazione sono definite tre +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 è: @@ -682,15 +682,41 @@ stream senza estrarlo effettivamente (la tecnica dato una \textsl{sbirciatina} a quello che viene dopo. Nel nostro caso questo tipo di comportamento può essere realizzato prima -leggendo il carattere, e poi rimandandolo indietro, cosicchè ridiventi +leggendo il carattere, e poi rimandandolo indietro, cosicché ridiventi 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)} - Cancella i flag di errore ed end-of-file di \param{stream}. + Rimanda indietro il carattere \param{c}, con un cast a \type{unsigned + char}, sullo stream \param{stream}. + + \bodydesc{La funzione ritorna \param{c} in caso di successo e + \macro{EOF} in caso di errore.} \end{prototype} +benché lo standard ANSI C preveda che l'operazione possa essere ripetuta +per un numero arbitrario di caratteri, alle implementazioni è richiesto +di garantire solo un livello; questo è quello che fa la \acr{glibc}, che +richiede che avvenga un'altra operazione fra due \func{ungetc} +successive. + +Non è necessario che il carattere che si manda indietro sia l'ultimo che +si è letto, e non è necessario neanche avere letto nessun carattere +prima di usare \func{ungetc}, ma di norma la funzione è intesa per +essere usata per rimandare indietro l'ultimo carattere letto. +Nel caso \param{c} sia un \macro{EOF} la funzione non fa nulla, e +restituisce sempre \macro{EOF}; così si può usare \func{ungetc} anche +con il risultato di una lettura alla fine del file. +Se si è alla fine del file si può comunque rimandare indietro un +carattere, il flag di end-of-file verrà automaticamente cancellato +perché c'è un nuovo carattere disponibile che potrà essere riletto +successivamente. +Infine si tenga presente che \func{ungetc} non altera il contenuto del +file, ma opera esclusivamente sul buffer interno. Se si esegue una +qualunque delle operazioni di riposizionamento (vedi +\secref{sec:file_fseek}) i caratteri rimandati indietro vengono +scartati. \subsection{Input/output di linea} @@ -698,10 +724,11 @@ lettura si chiama \func{ungetc} ed il suo prototipo La terza ed ultima modalità di input/output non formattato è quello di linea, in cui legge o scrive una riga alla volta; questa è una modalità -molto usata, ma che presenta le caratteristiche più controverse. +molto usata per l'I/O da terminale, ma che presenta le caratteristiche +più controverse. -Le funzioni per leggere una linea sono sostazialmente due, \func{gets} e -\func{fgets}, i rispettivi prototipi sono: +Le funzioni per leggere una linea sono sostanzialmente due, \func{gets} e +\func{fgets}, i cui rispettivi prototipi sono: \begin{functions} \headdecl{stdio.h} @@ -798,7 +825,7 @@ stream; se non si Gli stream possono essere usati in applicazioni multi-thread allo stesso modo in cui sono usati nelle applicazioni normali, ma si deve essere -consapovoli delle possibili complicazioni anche quando non si usano i +consapevoli delle possibili complicazioni anche quando non si usano i thread, dato che l'implementazione delle librerie è influenzata pesantemente dalle richieste necessarie per garantirne l'uso coi thread.