
In diesem Kapitel will ich einige Funktionen vorstellen die nicht mehr so häufig verwendet werden. Aber trotzdem will ich sie Ihnen nicht vorenthalten.
Zuerst die Funktion 'feof' hier der Syntax...
int feof(FILE *datei);
Mit dieser Funktion können sie den EOF - Fehlerflag testen ob er gesetzt ist oder nicht. Hierzu nun eine Beispiel.....
/*Download:feof.c*/
#include <stdio.h>
int main()
{
int c;
while(c=getc(stdin))
if(feof(stdin)!=0)
break;
else
putc(c,stdout);
return 0;
}
|
Das Programm dürfte Ihnen noch vom Kapitel zuvor bekannt sein. Wir haben hier anstatt....
while((c=getc(stdin)) != EOF)
...dies verwendet...
while(c=getc(stdin))
if(feof(stdin)!=0)
Anstatt zu testen ob der Wert von der Variablen c dem von EOF entspricht haben wir mit feof getestet ob das EOF - Flag gesetzt ist. Falls nicht gibt die Funktion einen Wert von 0 zurück, falls aber EOF gesetzt ist gib die Funktion einen Wert ungleich 0 zurück. Also eigentlich keine Verbesserung eher eine Verkomplizierung. Wenn sie jetzt in einem längeren Programm nochmals feof(..) verwenden wollen müssen sie erst mal mittels...
clearerr(stdin);
......das EOF - Flag wieder auf 0 zurücksetzen da es weiterhin gesetzt ist. Also wozu die Umstände. Machen sie es sich nicht unnötig schwer. Natürlich können sie anstatt stdin auf jede von Ihnen zuvor geöffnete Datei vom Typ FILE setzen.
Nun zu ferror. Der Syntax von ferror lautet...
int ferror(FILE *datei);
ferror ist im Prinzip Dasselbe wie feof, nur das er unser Datei auf Fehler überprüft. Auch hier ist im Prinzip dieser Aufruf....
if((quelle=fopen(argv[1],"r")) == NULL)
...Dasselbe wie....
quelle=fopen(argv[1],"r");
if(ferror(quelle))
Auch bei ferror(..) gilt falls sie die Funktion nochmals im Programm einsetzen wollen müssen sie hier die Funktion clearerr(..) mittels...
clearerr(quelle);
...den Fehler - Flag zurücksetzen. Wen sie wollen können sie diese Funktionen ja mal in einem Programm testen. Ich erspare mir das hier.
Nur noch schnell der Syntax von clearerr()...
void clearerr(FILE *datei);
Wie man clearerr einsetzt habe ich oben schon zweimal erklärt. clearerr dient zum zurücksetzen des EOF - Flags und Fehler - Flags.
Nach längerer Überlegung habe ich ein Sinnvolles Beispiel für feof und clearerr gefunden.
Für das Auslesen einer wachsenden Datei. Wir schreiben ein Programm das eine Datei zeilenweise ausliest. Solange bis EOF erreicht wird. Anschließend löschen wir das EOF-Flag wieder und lesen aus der Datei
Zeichenweiße ein. Lesen wir das EOF löschen wir das Flag wieder und setzen den Stream ein Zeichen von der aktuellen Position zurück mit fseek. Das ganze natürlich in einer Endlosschleifen. Hier der Code dazu......
/*Download:cleof.c*/
#include <stdio.h>
#include <stdlib.h>
/*Bitte anpassen*/
#define DATEI "datei.txt"
int main()
{
FILE *fp;
int c;
char Buffer[1024]={0};
fp = fopen(DATEI,"r");
if(fp == NULL)
{
fprintf(stderr, "Konnte %s nicht öffnen\n",DATEI);
exit(0);
}
while(1)
{
while(!feof(fp)) /*Solange EOF nicht erreicht wird*/
{
fgets(Buffer,1024,fp); /*Zeilenweises Einlesen*/
fprintf(stdout,"%s",Buffer); /*Anpassen*/
}
clearerr(fp); /*EOF-Flag löschen*/
while(c=fgetc(fp)) /*Jetzt Zeichenweise einlesen*/
if(c==EOF)
{ /*Immer noch EOF?*/
ungetc(c,fp); /*Wieder zurück damit*/
clearerr(fp); /*EOF-Flag löschen*/
}
else
{
fseek(fp,-1L,SEEK_CUR); /*Wieder 1 Stelle vor EOF*/
break;
}
}
/*Wird nie erreicht*/
fclose(fp);
return 0;
}
|

© 2001,2002 Jürgen Wolf
|