freopen, freopen_s
Von de.cppreference.net
| Definiert in Header <stdio.h>
|
||
FILE* freopen( const char* filename, const char* mode,
FILE* stream );
|
(1) | (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 mit
stream verknüpfte Datei zu schließen, wobei alle Fehler ignoriert werden. Wenn filename nicht null ist, wird dann versucht, die durch filename angegebene Datei unter Verwendung von mode zu öffnen, als ob durch fopen, und diese Datei wird mit dem Dateistrom verbunden, auf den stream zeigt. Wenn filename ein Nullzeiger ist, versucht die Funktion, die bereits mit stream verbundene Datei wieder zu öffnen (es ist implementierungsdefiniert, welche Modusänderungen in diesem Fall erlaubt sind).2) Wie (1), außer dass
mode wie in fopen_s behandelt wird und dass der Zeiger auf den Dateistrom in newstreamptr geschrieben wird und die folgenden Fehler zur Laufzeit erkannt werden und die derzeit installierte Einschränkungs-Handler-Funktion aufrufen:
newstreamptrist ein Nullzeigerstreamist ein Nullzeigermodeist ein Nullzeiger
Wie bei allen grenzgeprüften Funktionen ist
freopen_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und der Benutzer __STDC_WANT_LIB_EXT1__ auf die ganzzahlige Konstante 1 setzt, bevor er <stdio.h> einbindet.Parameter
| filename | - | Dateiname, der dem Dateistrom zugeordnet werden soll |
| mode | - | Nullterminierte Zeichenfolge, die den neuen Dateizugriffsmodus |
| bestimmtstream | - | der zu ändernde Dateistrom |
| newstreamptr | - | Zeiger auf einen Zeiger, in den die Funktion das Ergebnis speichert (ein Ausgabeparameter) |
Dateizugriffsflags
| Dateizugriff Moduszeichenfolge |
Bedeutung | Erklärung | Aktion, wenn die Datei bereits existiert |
Aktion, wenn die Datei nicht existiert |
|---|---|---|---|---|
"r"
|
Lesen | Öffnet eine Datei zum Lesen | Lesen von Anfang an | Fehler beim Öffnen |
"w"
|
Schreiben | Erstellt eine Datei zum Schreiben | Inhalt zerstören | Neu erstellen |
"a"
|
Anhängen | An eine Datei anhängen | An Ende schreiben | Neu erstellen |
"r+"
|
Lesen erweitert | Öffnet eine Datei zum Lesen/Schreiben | Lesen von Anfang an | Fehler |
"w+"
|
Schreiben erweitert | Erstellt eine Datei zum Lesen/Schreiben | Inhalt zerstören | Neu erstellen |
"a+"
|
Anhängen erweitert | Öffnet eine Datei zum Lesen/Schreiben | An Ende schreiben | Neu erstellen |
Das Dateizugriffsmodus-Flag "b" kann optional angegeben werden, um eine Datei im Binärmodus zu öffnen. Dieses Flag hat auf POSIX-Systemen keine Wirkung, aber unter Windows deaktiviert es die spezielle Behandlung von '\n' und '\x1A'. Bei den Anhängemodi für den Dateizugriff werden Daten unabhängig von der aktuellen Position des Dateipositionsanzeigers an das Ende der Datei geschrieben. | ||||
| Das Verhalten ist undefiniert, wenn der Modus nicht einer der oben aufgeführten Zeichenfolgen ist. Einige Implementierungen definieren zusätzliche unterstützte Modi (z. B. Windows). | ||||
Im Aktualisierungsmodus ('+') können sowohl Eingabe als auch Ausgabe durchgeführt werden, aber auf eine Ausgabe darf keine Eingabe folgen, ohne einen dazwischenliegenden Aufruf von fflush, fseek, fsetpos oder rewind, und auf eine Eingabe darf keine Ausgabe folgen, ohne einen dazwischenliegenden Aufruf von fseek, fsetpos oder rewind, es sei denn, die Eingabeoperation hat das Dateiende erreicht. Im Aktualisierungsmodus dürfen Implementierungen den Binärmodus verwenden, selbst wenn der Textmodus angegeben ist.
| ||||
Das Dateizugriffsmodus-Flag "x" kann optional an die Spezifizierer "w" oder "w+" angehängt werden. Dieses Flag erzwingt, dass die Funktion fehlschlägt, wenn die Datei existiert, anstatt sie zu überschreiben. (C11)
| ||||
Bei Verwendung von fopen_s oder freopen_s verhindern die Dateizugriffsberechtigungen für jede mit "w" oder "a" erstellte Datei, dass andere Benutzer darauf zugreifen. Das Dateizugriffsmodus-Flag "u" kann optional jedem Spezifizierer vorangestellt werden, der mit "w" oder "a" beginnt, um die Standard-fopen-Berechtigungen zu aktivieren. (C11)
| ||||
Rückgabewert
1) Eine Kopie des Wertes von
stream bei Erfolg, Nullzeiger bei Misserfolg.2) Null bei Erfolg (und eine Kopie des Wertes von
stream wird in *newstreamptr geschrieben), ungleich Null bei Fehler (und ein Nullzeiger wird in *newstreamptr geschrieben, es sei denn, newstreamptr ist selbst ein Nullzeiger).Anmerkungen
freopen ist die einzige Möglichkeit, die Schmal-/Breit-Orientierung eines Stroms zu ändern, sobald sie 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). Ein möglicher Workaround ist die nicht standardisierte Funktion _setmode().
Beispiel
Der folgende Code leitet stdout in eine Datei um.
Diesen Code ausführen
#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
- C23-Standard (ISO/IEC 9899:2024):
- 7.21.5.4 Die Funktion freopen (S.: TBD)
- K.3.5.2.2 Die Funktion freopen_s (S.: TBD)
- 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
(C11) |
öffnet eine Datei (Funktion) |
| schließt eine Datei (Funktion) | |
C++-Dokumentation für freopen
| |