Namensräume
Varianten
Aktionen

freopen, freopen_s

Von cppreference.com
< c‎ | io
 
 
Datei-Ein-/Ausgabe
Typen und Objekte
        
Funktionen
Datei-Zugriff
freopenfreopen_s
(C11)  
(C95)
Unformatierte Ein-/Ausgabe
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Formatierte Eingabe
Direkte Ein-/Ausgabe
Formatierte Ausgabe
Dateipositionierung
Fehlerbehandlung
Operationen auf Dateien
 
Definiert in Header <stdio.h>
(1)
FILE *freopen( const char *filename, const char *mode,
               FILE *stream );
(bis C99)
FILE *freopen( const char *restrict filename, const char *restrict mode,
               FILE *restrict stream );
(seit C99)
errno_t freopen_s( FILE *restrict *restrict newstreamptr,

                   const char *restrict filename, const char *restrict mode,

                   FILE *restrict stream );
(2) (seit C11)
1) Zuerst wird versucht, die Datei, die mit stream verbunden ist, zu schließen, wobei eventuelle Fehler ignoriert werden. Wenn filename nicht NULL ist, wird versucht, die durch filename angegebene Datei mit mode zu öffnen, als ob dies mit fopen geschehen wäre, und diese Datei wird mit dem Dateistream verbunden, auf den stream zeigt. Wenn filename ein Nullzeiger ist, versucht die Funktion, die bereits mit stream verbundene Datei erneut zu öffnen (welche Modusänderungen in diesem Fall zulässig sind, ist implementierungsabhängig).
2) Wie bei (1), außer dass mode wie in fopen_s behandelt wird und der Zeiger auf den Dateistream in newstreamptr geschrieben wird und die folgenden Fehler zur Laufzeit erkannt und die aktuell installierte Constraint-Handler-Funktion aufgerufen wird.
  • newstreamptr ist ein Nullzeiger.
  • stream ist ein Nullzeiger.
  • mode ist ein Nullzeiger.
Wie bei allen grenzgeprüften Funktionen ist freopen_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ vor dem Einbinden von <stdio.h> auf die Ganzzahlkonstante 1 setzt.

Inhalt

Parameter

filename - Dateiname, dem der Dateistream zugeordnet werden soll
mode - null-terminierte Zeichenkette, die den neuen Dateizugriffsmodus bestimmt
stream - der zu ändernde Dateistream
newstreamptr - Zeiger auf einen Zeiger, wohin die Funktion das Ergebnis schreibt (ein Out-Parameter)

Datei-Zugriffsflags

Datei-Zugriff
Modus-String
Bedeutung Erklärung Aktion, wenn Datei
bereits existiert
Aktion, wenn Datei
nicht existiert
"r" read Datei zum Lesen öffnen lesen ab Anfang Fehler beim Öffnen
"w" schreiben Datei zum Schreiben erstellen Inhalt löschen neu erstellen
"a" append An eine Datei anhängen Ende schreiben neu erstellen
"r+" erweitertes Lesen Datei zum Lesen/Schreiben öffnen lesen ab Anfang error
"w+" erweitertes Schreiben Datei zum Lesen/Schreiben erstellen Inhalt löschen neu erstellen
"a+" erweitertes Anhängen Datei zum Lesen/Schreiben öffnen Ende schreiben neu erstellen
Das Dateizugriffsmodus-Flag "b" kann optional angegeben werden, um eine Datei im Binärmodus zu öffnen. Dieses Flag hat keine Auswirkung auf POSIX-Systemen, aber unter Windows deaktiviert es die spezielle Behandlung von '\n' und '\x1A'.
Bei Anhänge-Dateizugriffsmodi werden Daten am Ende der Datei geschrieben, unabhängig von der aktuellen Position des Dateipositionsindikators.
Das Verhalten ist undefiniert, wenn der Modus keiner der oben aufgeführten Strings ist. Einige Implementierungen definieren zusätzliche unterstützte Modi (z. B. Windows).
Im Update-Modus ('+') können sowohl Eingabe als auch Ausgabe durchgeführt werden, aber auf die Ausgabe darf keine Eingabe folgen, ohne einen dazwischenliegenden Aufruf von fflush, fseek, fsetpos oder rewind, und auf die Eingabe darf keine Ausgabe folgen, ohne einen dazwischenliegenden Aufruf von fseek, fsetpos oder rewind, es sei denn, die Eingabeoperation hat das Dateiende erreicht. Im Update-Modus dürfen Implementierungen den Binärmodus verwenden, auch wenn der Textmodus angegeben ist.
Das Dateizugriffsmodus-Flag "x" kann optional an die Spezifikatoren "w" oder "w+" angehängt werden. Dieses Flag bewirkt, dass die Funktion fehlschlägt, wenn die Datei existiert, anstatt sie zu überschreiben. (C11)
Bei Verwendung von fopen_s oder freopen_s verhindern Dateizugriffsberechtigungen für jede mit "w" oder "a" erstellte Datei, dass andere Benutzer darauf zugreifen. Das Dateizugriffsmodus-Flag "u" kann optional jedem Spezifikator vorangestellt werden, der mit "w" oder "a" beginnt, um die Standardberechtigungen von fopen zu aktivieren. (C11)

Rückgabewert

1) Eine Kopie des Wertes von stream im Erfolgsfall, ein Nullzeiger im Fehlerfall.
2) Null im Erfolgsfall (und eine Kopie des Wertes von stream wird in *newstreamptr geschrieben), ungleich Null im Fehlerfall (und ein Nullzeiger wird in *newstreamptr geschrieben, es sei denn, newstreamptr ist selbst ein Nullzeiger).

Anmerkungen

freopen ist der einzige Weg, die schmale/weite Ausrichtung eines Streams zu ändern, sobald diese durch eine E/A-Operation oder durch fwide festgelegt wurde.

Die Microsoft CRT-Version von freopen unterstützt keine Modusänderungen, wenn filename ein Nullzeiger ist, und behandelt dies als Fehler (siehe Dokumentation). Eine mögliche Abhilfe ist die nicht-standardmäßige Funktion _setmode().

Beispiel

Der folgende Code leitet stdout in eine Datei um.

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    puts("stdout is printed to console");
    if (freopen("redir.txt", "w", stdout) == NULL)
    {
       perror("freopen() failed");
       return EXIT_FAILURE;
    }
    puts("stdout is redirected to a file"); // this is written to redir.txt
    fclose(stdout);
    return EXIT_SUCCESS;
}

Ausgabe

stdout is printed to console

Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 7.21.5.4 Die Funktion freopen (S. 224–225)
  • K.3.5.2.2 Die Funktion freopen_s (S. 429–430)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.21.5.4 Die Funktion freopen (S. 307)
  • K.3.5.2.2 Die Funktion freopen_s (S. 590)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.19.5.4 Die Funktion freopen (S. 272–273)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.9.5.4 Die Funktion freopen

Siehe auch

öffnet eine Datei
(Funktion) [bearbeiten]
schließt eine Datei
(Funktion) [bearbeiten]
C++-Dokumentation für freopen