freopen, freopen_s
Von cppreference.com
| Definiert in Header <stdio.h> |
||
| (1) | ||
| (bis C99) | ||
| (seit C99) | ||
| (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.-
newstreamptrist ein Nullzeiger. -
streamist ein Nullzeiger. -
modeist ein Nullzeiger.
-
- Wie bei allen grenzgeprüften Funktionen ist
freopen_snur 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.
Führen Sie diesen Code aus
#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
| (C11) |
öffnet eine Datei (Funktion) |
| schließt eine Datei (Funktion) | |
| C++-Dokumentation für freopen
| |