14.5    Fehler oder Dateiende prüfen

Wenn Sie jetzt anschließend auf die Streams mit Funktionen operieren und eine Funktion abgebrochen wurde, ist es nicht immer eindeutig, ob ein Fehler aufgetreten ist oder ob einfach nur das Dateiende erreicht wurde. So wird beispielsweise EOF von einer Lesefunktion zurückgegeben, wenn das Dateiende erreicht wird. Der Rückgabewert EOF kann aber auch bei einem aufgetretenen Fehler dieser Funktion zurückgegeben werden. Damit Sie diese beiden Fälle unterscheiden können, lernen Sie nun die entsprechenden Funktionen mit feof() und ferror() kennen. Mit diesen können Sie prüfen, ob das Dateiende erreicht wurde oder ob ein Fehler aufgetreten ist.

14.5.1    End-of-File Indicator

Wenn Sie beim Lesen einer Datei das Dateiende erreicht haben, zeigt dies ein spezielles Flag an. Dieses Flag wird als End-of-File-Indicator bezeichnet. Ob dieses Flag gesetzt ist, können Sie mit der Funktion feof() ermitteln. Die Funktion erwartet als Argument den Stream, den Sie überprüfen wollen.

Die Syntax von feof()lautet:

#include <stdio.h>
int feof(FILE *fp);

Wenn das Dateiende erreicht wurde und der End-of-File Indicator gesetzt ist, gibt die Funktion einen Wert ungleich 0 zurück. Wurde das Dateiende noch nicht erreicht, wird gleich 0 zurückgegeben.

14.5.2    Error Indicator

Ein weiteres Flag, das in Verbindung mit Streams gesetzt sein kann, ist der Error Indicator, mit dem Sie feststellen können, ob ein Fehler während einer Operation auf einen Stream aufgetreten ist. Dieses Flag können Sie mit der Funktion ferror() überprüfen.

Die Syntax der Funktion lautet:

#include <stdio.h>
int ferror(FILE* fp);

Bei einem Fehler im Stream fp gibt diese Funktion einen Wert ungleich 0 zurück. 0 wird zurückgegeben, wenn kein Fehler aufgetreten ist.

14.5.3    Informationen zum Fehler ausgeben

Tritt bei einer Funktion ein Fehler auf, wird in der globalen Variablen errno ein entsprechender Fehlerwert gesetzt. Mit den beiden Funktionen strerror() und perror() können Sie diese Fehlermeldung ausgeben lassen. Die Variable errno ist in der Header-Datei errno.h definiert. Es folgt nun ein Beispiel für die Verwendung von perror():

long aktPos = ftell(fp);
if(aktPos < 0) {
perror("Fehler bei ftell()");
}

Ist in diesem Fall die Funktion ftell() fehlgeschlagen, gibt die Funktion perror() auf dem GCC eine Fehlermeldung aus, etwa:

Fehler bei ftell(): Bad file descriptor

Der Doppelpunkt und die Fehlermeldung dahinter mit einem Newline-Zeichen wurden von der Funktion perror() hinzugefügt. Leider sind die meisten Fehlermeldungen compiler- und systemabhängig. Lediglich folgende drei Fehlerkonstanten sind in der Header-Datei errno.h garantiert und können daher zuverlässig von perror() oder strerror() ausgegeben werden:

Konstante

Bedeutung

EDOM

domain error: unzulässiges Argument für eine mathematische Funktion.

EILSEQ

illegal sequence: Bei der Verarbeitung von Multibyte-Zeichen wurde ein Byte entdeckt, das kein gültiges Zeichen darstellt.

ERANGE

range error: Das Ergebnis liegt außerhalb des Bereichs.

Tabelle 14.2    Standardmäßige Fehlerkonstanten

14.5.4    Fehler- und EOF-Flag zurücksetzen – clearerr()

Wollen Sie die Flags des End-of-File und des Error Indicators eines Streams zurücksetzen, können Sie die Funktion clearerr() aufrufen:

#include <stdio.h>
void clearerr(FILE* fp);