====== freopen() ====== ''freopen()'' ist definiert in der ''[[start|stdio]]'', die in C über ''stdio.h'', bzw. in C++ über ''cstdio'' eingebunden wird. ===== Funktion ===== ''freopen()'' schließt zunächst den übergebenen Stream und öffnet anschließend wieder im angegebenen Modus. Häufig wird diese Funktion verwendet, um die Standard-Streams (''[[stdin]]'', ''[[stdout]]'' und ''[[stderr]]'') auf Dateien umzulenken. ===== Signatur ===== #include int freopen( char const * filename, char const * mode, FILE * stream ); **filename**: die neu zu öffnende Datei \\ **mode**: Anweisung, wie die Datei zu öffnen ist.\\ \\ **Return Value**: Zeiger auf geöffneten Stream oder ''[[c:lib:stddef:null|NULL]]''. Je nach Modus befindet sich die Schreib-/Lese-Position am Anfang der Datei, wenn angefügt werden soll befindet sie sich direkt am Ende der Datei, so dass am Ende der Datei geschrieben werden kann. Die Position kann nach dem Öffnen mit [[fseek()]] beliebig versetzt werden. ^ **mode** ^ Wirkung ^ Position im File ^ | "r" | Die Datei wird zum Lesen geöffnet. Es kann nicht geschrieben werden, die Datei muss existieren und wird nicht angelegt. | Anfang | | "w" | Die Datei wird zum Schreiben geöffnet. Existiert sie nicht, wird sie erstellt, eine vorhandene Datei wird überschrieben. Daten werden am Beginn der Datei geschrieben. | Anfang | | "a" | Die Datei wird zum Anhängen geöffnet, existiert die Datei nicht, so wird sie erstellt. Daten werden hinten an die Datei angehängt. | Ende | | "r+" | Die Datei wird zum Lesen und Schreiben geöffnet, die Datei muss existieren und wird nicht angelegt. | Anfang | | "w+" | Die Datei wird zum Lesen und Schreiben geöffnet. Existiert sie nicht, wird sie erstellt. Daten werden am Beginn der Datei geschrieben. | Anfang |  | "a+" | Die Datei wird zum Lesen und Schreiben geöffnet. Existiert sie nicht, wird sie erstellt. Daten werden hinten an die Datei angehängt. | Ende | Per Default werden Dateien zeilenorientiert geöffnet. Hängt man dem ''mode'' zusätzlich ein "b" an (z.B. "r+b"), so wird die Datei im Binärmodus geöffnet. ===== Fehlerquellen ===== Häufig werden Pfade im falschen Format angegeben, zum Beispiel Unix-Pfade (''/home/user/file.txt'') statt eines Windows-Pfads (''C:\Directory\file.txt'').\\ Bei Windowspfaden wird häufig vergessen, dass ein Backslash ('\') in C doppelt geschrieben werden muss, also beispielsweise (''char * filename = "C:\\Directory\\file.txt"'') ===== Beispiel ===== #include #include int main( void ) { char const * filename = "stdout.txt"; if( freopen( filename, "w", stdout ) ) printf( "Dieser Text landet in einer Datei\n" ); else fprintf( stderr, "Datei '%s' konnte nicht geöffnet werden.\n", filename ); return EXIT_SUCCESS; } **Ausgabe**: \\ Konnte die Datei ''stdout.txt'' zum Schreiben geöffnet werden, so wird der Satz "Dieser Text landet in einer Datei\n" in sie hineingeschrieben. Für den Fall, dass sie nicht geöffnet werden konnte, so hat ''freopen()'' versucht ''stdout'' zu schließen. Aus diesem Grund wird die Fehlermeldung mit ''[[fprintf()]]'' an die [[stderr|Fehlerkonsole]] übertragen. ===== siehe auch ===== [[c:lib:stdio:start|stdio]]: [[c:lib:stdio:fopen()]], [[c:lib:stdio:fclose()]], [[c:lib:stdio:printf()]], [[c:lib:stdio:fprintf()]]