16.18 Datei (Stream) erneut öffnen – »freopen()« 

Die Syntax von freopen() lautet:
#include <stdio.h> FILE *freopen( const char * restrict pfad, const char * restrict modus, FILE * restrict datei );
Mit freopen() wird zuerst versucht, den Stream datei zu schließen. Fehler beim Schließen werden dabei ignoriert. Danach wird dem FILE-Zeiger die Datei zugeordnet, die in pfad angegeben wurde. Als modus können dieselben Modi verwendet werden wie bei der Funktion fopen(). Um es deutlicher auszudrücken: Sie erzeugen mit freopen() keinen neuen Stream, sondern verwenden einen vorhandenen Stream, der mit dem dritten Argument angegeben wird. Die Funktion wird für die Umlenkung eines Streams verwendet. Als Rückgabewert erhalten Sie bei Erfolg einen Zeiger auf den mit der Datei verbundenen Stream oder im Fehlerfall den Nullzeiger. Hierzu ein Beispiel:
/* freopen1.c */ #include <stdio.h> #include <stdlib.h> #define MAX 80 int main(void) { FILE *quelle; char datei1[20], datei2[20]; char puffer[MAX]; printf("Welche Datei wollen Sie als erste lesen : "); scanf("%19s",datei1); printf("Welche Datei wollen Sie anschließend lesen : "); scanf("%19s",datei2); quelle=fopen(datei1,"r"); if( NULL == quelle ) { fprintf(stderr, "Fehler beim Oeffnen von %s\n", datei1); return EXIT_FAILURE; } while(fgets(puffer,MAX,quelle) != NULL) fputs(puffer,stdout); printf("\n"); freopen(datei2,"r",quelle); while(fgets(puffer,MAX,quelle) != NULL) fputs(puffer,stdout); return EXIT_SUCCESS; }
Mit der Zeile
freopen(datei2,"r",quelle);
wurde ein Schließen der Datei mit fclose() und ein Öffnen der Datei datei2 gespart. Da über freopen() die Datei mit dem FILE-Zeiger (datei1) automatisch geschlossen wurde, wird dem FILE-Zeiger quelle gleich die Datei mit dem Pfad datei2 übergeben.
So wird freopen() aber nicht unbedingt angewandt. Da freopen() nicht überprüft, ob der Stream ordnungsgemäß geschlossen wurde, rate ich auch davon ab. Ein Fehler wird schlicht ignoriert.
freopen() wird hauptsächlich dazu benutzt, die Standard-Streams stdin, stdout und stderr zu verbinden – in einfachen Worten: die Streams der Ein-/Ausgabe umzuleiten. Hierzu sehen Sie ein einfaches Beispiel:
/* freopen2.c */ #include <stdio.h> #include <stdlib.h> int main(void) { printf("Wir schreiben eine Datei \"log.txt\"\n"); freopen("log.txt","a+",stdout); printf("Dieser Text steht in der Datei \"log.txt\"\n"); return EXIT_SUCCESS; }
Hier wird z. B. die Standardausgabe in die Datei log.txt umgeleitet. Das erste printf() wird noch auf dem Bildschirm ausgegeben. Das zweite wird dagegen in die Datei log.txt umgeleitet, die sich hier im selben Verzeichnis wie das Programm befinden sollte.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.