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:
Controlla il flag di end-of-file di stream.
Controlla il flag di errore di stream.
Entrambe le funzioni ritornano un valore diverso da zero se i relativi flag sono impostati.
Entrambi i flag (di errore e di end-of-file) possono essere cancellati usando la funzione clearerr, il cui prototipo è:
Cancella i flag di errore ed end-of-file di stream.