[Avanti]  [Indietro]  [Su]  

7.2.2 Lettura e scrittura su uno stream

Una delle caratteristiche più utili dell'interfaccia degli stream è la ricchezza delle funzioni disponibili per le operazioni di lettura e scrittura sui file. Sono infatti previste ben tre diverse modalità modalità di input/output non formattato: 1. binario in cui legge/scrive un blocco di dati alla volta, vedi sez. 7.2.3. 2. a caratteri in cui si legge/scrive un carattere alla volta (con la bufferizzazione gestita automaticamente dalla libreria), vedi sez. 7.2.4. 3. di linea in cui si legge/scrive una linea alla volta (terminata dal carattere di newline '\n'), vedi sez. 7.2.5. ed inoltre la modalità di input/output formattato.

A differenza dell'interfaccia dei file descriptor, con gli stream il 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 int) EOF5 definito anch'esso nell'header stdlib.h.

Dato che le funzioni dell'interfaccia degli stream sono funzioni di libreria che si appoggiano a delle system call, esse non impostano direttamente la variabile errno, che mantiene il valore impostato dalla system call che ha riportato l'errore.

Siccome la condizione di end-of-file è anch'essa segnalata come errore, nasce il problema di come distinguerla da un errore effettivo; basarsi solo sul valore di ritorno della funzione e controllare il valore di errno infatti non basta, dato che quest'ultimo potrebbe essere stato impostato in una altra occasione, (si veda sez. 8.5.1 per i dettagli del funzionamento di errno).

Per questo motivo tutte le implementazioni delle librerie standard mantengono per ogni stream almeno due flag all'interno dell'oggetto FILE, il flag di 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 feof e ferror, i cui prototipi sono:

Entrambe le funzioni ritornano un valore diverso da zero se i relativi flag sono impostati.

si tenga presente comunque che la lettura di questi flag segnala soltanto che c'è stato un errore, o che si è raggiunta la fine del file in una qualunque operazione sullo stream, il controllo quindi deve essere 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 clearerr, il cui prototipo è:

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 clearerr_unlocked che non esegue il blocco dello stream (vedi sez. 7.3.3).


[Avanti]  [Indietro]  [Su]  
© 2000-2003 Simone Piccardi
Pubblicazione web curata da Mirko Maischberger