BEZEICHNUNG
fopen, fdopen, freopen - Funktionen zum Öffnen von DatenströmenBIBLIOTHEK
Standard-C-Bibliothek ( libc, -lc)ÜBERSICHT
#include <stdio.h>
FILE *fopen(const char *restrict pfadname, const char *restrict modus); FILE *fdopen(int fd, const char *modus); FILE *freopen(const char *restrict pfadname, const char *restrict modus, FILE *restrict datenstrom);
Mit Glibc erforderliche Feature-Test-Makros
(siehe feature_test_macros(7)):
fdopen():
_POSIX_C_SOURCE
BESCHREIBUNG
Die Funktion fopen() öffnet die Datei, deren Name die Zeichenkette ist, auf die pfadname zeigt, und erzeugt einen damit verbundenen Datenstrom. Das Argument modus zeigt auf eine Zeichenkette, die mit einer der folgenden Sequenzen beginnt (möglicherweise gefolgt von zusätzlichen Zeichen, wie nachfolgend beschrieben):- r
- eine Textdatei zum Lesen öffnen. Der Datenstrom wird auf den Dateianfang positioniert.
- r+
- die Textdatei zum Lesen und Schreiben öffnen. Der Datenstrom wird auf den Dateianfang positioniert.
- w
- die Datei auf die Länge Null kürzen oder eine Textdatei zum Schreiben erzeugen. Der Datenstrom wird auf den Dateianfang positioniert.
- w+
- die Datei zum Lesen und Schreiben öffnen. Die Datei wird erzeugt, wenn sie nicht existiert, ansonsten abgeschnitten. Der Datenstrom wird auf den Dateianfang positioniert.
- a
- zum Anhängen (Schreiben am Dateiende) öffnen. Die Datei wird erzeugt, wenn sie nicht existiert. Der Datenstrom wird auf das Dateiende positioniert.
- a+
- zum Lesen und Anhängen (Schreiben am Dateiende) öffnen. Die Datei wird erzeugt, wenn sie nicht existiert. Die Ausgabe wird immer am Ende der Datei angehängt. POSIX legt nicht fest, was die anfängliche Leseposition ist, wenn dieser Modus verwandt wird. Für Glibc ist die anfängliche Dateiposition zum Lesen am Dateianfang, aber für Android/BSD/MacOS ist die anfängliche Dateiposition zum Lesen am Ende der Datei.
fseek(stream, 0, SEEK_END);
Der dem Strom zugeordnete Dateideskriptor wird geöffnet, als ob ein Aufruf von open(2) mit den folgenden Schaltern stattgefunden hätte:
fopen()-Modus | open()-Schalter |
r | O_RDONLY |
w | O_WRONLY | O_CREAT | O_TRUNC |
a | O_WRONLY | O_CREAT | O_APPEND |
r+ | O_RDWR |
w+ | O_RDWR | O_CREAT | O_TRUNC |
a+ | O_RDWR | O_CREAT | O_APPEND |
fdopen()
Die Funktion fdopen() erzeugt einen mit einem existierenden Dateideskriptor fd verbundenen Datenstrom. Der modus der Zeichenkette (einer der Werte »r«, »r+«, »w«, »w+«, »a«, »a+«) muss kompatibel mit dem Modus des Dateideskriptors sein. Der Dateipositionsanzeiger des neuen Datenstroms wird den von fd gesetzt und die Anzeigen von Fehlern und Dateienden werden geleert. Die Modi »w« und »w+« verursachen kein Kürzen der Datei. dup() wird nicht aufgerufen und der Dateideskriptor wird geschlossen, wenn der mit fdopen() erzeugte Datenstrom geschlossen wird. Wenn fdopen() auf gemeinsam benutzten Speicher angewandt wird, ist das Ergebnis nicht definiert.freopen()
Die Funktion freopen öffnet die Datei, deren Name die Zeichenkette ist, auf die pfadname zeigt, und verbindet damit den Datenstrom, auf den datenstrom zeigt. Der Originaldatenstrom wird geschlossen (wenn er existiert). Das Argument modus wird genauso wie in der Funktion fopen() benutzt. Falls das Argument pfadname ein Nullzeiger ist, ändert freopen() den Modus des Datenstroms auf den in modus angegebenen, d.h. freopen() öffnet den dem Pfadnamen zugeordneten Datenstrom erneut. Die Spezifikation für dieses Verhalten wurde in dem Standard C99 hinzugefügt, bei dem es heißt:In diesem Fall muss der dem Datenstrom
zugeordnete Dateideskriptor nicht geschlossen werden, falls der Aufruf von
freopen() erfolgreich ist. Es ist implementierungsabhängig,
welche Modusänderungen erlaubt sind (falls überhaupt) und unter
welchen Umständen.
Die primäre Verwendung der Funktion freopen() ist es, die Datei zu
ändern, die mit einem Standard-Textdatenstrom ( stderr,
stdin oder stdout) verbunden ist.
RÜCKGABEWERT
Bei erfolgreichem Abschluss geben fopen(), fdopen() und freopen() einen FILE-Zeiger zurück. Anderenfalls wird NULL zurückgegeben und errno dem Fehler entsprechend gesetzt.FEHLER
- EINVAL
- Der modus für fopen(), fdopen() oder freopen() war ungültig.
ATTRIBUTE
Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.Schnittstelle | Attribut | Wert |
fopen(), fdopen(), freopen() | Multithread-Fähigkeit | MT-Safe |
STANDARDS
fopen(), freopen(): POSIX.1-2001, POSIX.1-2008, C99. fdopen(): POSIX.1-2001, POSIX.1-2008.ANMERKUNGEN
Anmerkungen zur Glibc
Die C-Bibliothek von GNU erlaubt die folgenden Erweiterungen für die in modus angegebene Zeichenkette:- c (seit Glibc 2.3.3)
- keine »Öffnen«-Transaktion der Thread-Annulierungspunkte, nachfolgende Lese- und Schreibaktionen oder Thread-Abbruchpunkte durchführen. Dieser Schalter wird bei fdopen() ignoriert.
- e (seit Glibc 2.7)
- die Datei mit dem Schalter O_CLOEXEC öffnen. Siehe open(2) für weitere Informationen. Dieser Schalter wird bei fdopen() ignoriert.
- m (seit Glibc 2.3)
- versuchen mit mmap(2) auf die Datei zuzugreifen, anstatt der E/A-Aufrufe ( read(2), write(2)). Derzeit wird mmap(2) nur für Dateien probiert, die zum Lesen geöffnet sind.
- x
- die Datei exklusiv öffnen (entspricht dem Schalter O_EXCL von open(2)). Falls die Datei bereits exisitiert, schlägt fopen() fehl und setzt errno auf EEXIST. Dieser Schalter wird für fdopen() ignoriert.
FEHLER
Wenn der modus auf individuelle Schalterzeichen hin ausgewertet wird (d.h. die Zeichen, die der »ccs«-Spezifikation vorausgehen), beschränkt die Glibc-Implementierung von fopen() und freopen() die Anzahl der untersuchten Zeichen in modus auf sieben (oder, vor Glibc 2.14, auf sechs, was nicht ausreichte, um mögliche Spezifikationen wie »rb+cmxe« aufzunehmen). Die aktuelle Implementierung von fdopen() wertet höchstens fünf Zeichen in Modus aus.SIEHE AUCH
open(2), fclose(3), fileno(3), fmemopen(3), fopencookie(3), open_memstream(3)ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother <[email protected]>, Chris Leick <[email protected]>, Mario Blättermann <[email protected]>, Dr. Tobias Quathamer <[email protected]> und Helge Kreutzmann <[email protected]> erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer5. Februar 2023 | Linux man-pages 6.03 |