18.18 Datei (Stream) erneut öffnen – freopen
 
Die Syntax von freopen():
#include <stdio.h>
FILE *freopen(const char *pfad,const char *modus,FILE *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, die in pfad angegeben wurde, zugeordnet. Als modus können dieselben Modi verwendet werden wie bei der Funktion fopen(). 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 öffnen 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 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.
|