freopen()

freopen() ist definiert in der 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 <stdio.h>
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 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 <stdlib.h>
#include <stdio.h>
 
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 Fehlerkonsole übertragen.

siehe auch