fopen(3) Library Functions Manual fopen(3) BEZEICHNUNG fopen, fdopen, freopen - Funktionen zum Offnen von Datenstromen BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include 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() offnet 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 (moglicherweise gefolgt von zusatzlichen Zeichen, wie nachfolgend beschrieben): r eine Textdatei zum Lesen offnen. Der Datenstrom wird auf den Dateianfang positioniert. r+ die Textdatei zum Lesen und Schreiben offnen. Der Datenstrom wird auf den Dateianfang positioniert. w die Datei auf die Lange Null kurzen oder eine Textdatei zum Schreiben erzeugen. Der Datenstrom wird auf den Dateianfang positioniert. w+ die Datei zum Lesen und Schreiben offnen. Die Datei wird erzeugt, wenn sie nicht existiert, ansonsten abgeschnitten. Der Datenstrom wird auf den Dateianfang positioniert. a zum Anhangen (Schreiben am Dateiende) offnen. Die Datei wird erzeugt, wenn sie nicht existiert. Der Datenstrom wird auf das Dateiende positioniert. a+ zum Lesen und Anhangen (Schreiben am Dateiende) offnen. Die Datei wird erzeugt, wenn sie nicht existiert. Die Ausgabe wird immer am Ende der Datei angehangt. POSIX legt nicht fest, was die anfangliche Leseposition ist, wenn dieser Modus verwandt wird. Fur Glibc ist die anfangliche Dateiposition zum Lesen am Dateianfang, aber fur Android/BSD/MacOS ist die anfangliche Dateiposition zum Lesen am Ende der Datei. Die Zeichenkette modus kann auch den Buchstaben >>b<< enthalten, entweder als ein letztes Zeichen oder zwischen den Zeichen in einem der oben beschriebenen Zeichenketten aus zwei Buchstaben. Dies ist ausschliesslich aus Kompatibilitatsgrunden zu ISO C so und hat keinerlei Auswirkungen; das >>b<< wird auf allen POSIX-konformen Systemen einschliesslich Linux ignoriert. (Andere Systeme konnten Text- und Binardateien unterschiedlich behandeln und das >>b<< hinzuzufugen konnte sich als klug erweisen, falls Sie E/As auf die Binardatei ausfuhren und erwarten, dass Ihr Programm auf Nicht-UNIX-Umgebungen portiert wird.) Lesen Sie die folgenden ANMERKUNGEN, um Einzelheiten uber Glibc-Erweiterungen fur modus zu erfahren. Jede erstellte Datei wird den Modus S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666) haben, wie er durch den Umask-Wert des Prozesses geandert wurde (siehe umask(2)). Lese- und Schreibzugriffe konnen in Lese-/Schreibdatenstromen in beliebiger Reihenfolge gemischt werden. Beachten Sie, dass ANSI-C verlangt, dass zwischen einer Eingabe- und einer Ausgabeaktion eine Dateipositionierungsfunktion ausgefuhrt wird, ausser wenn eine Eingabe auf das Dateiende traf. (Falls diese Bedingung nicht eingehalten wird, darf beim Lesen etwas anderes als das zuletzt geschriebene zuruckgegeben werden.) Daher ist es ein bewahrtes Verfahren (und tatsachlich manchmal unter Linux notig) eine fseek(3)- oder fsetpos-Aktion zwischen Schreib- und Leseaktionen eines solchen Datenstroms einzuschieben. Diese Aktion konnte der Aufruf eines scheinbaren Leerbefehls (wie z.B. fseek(, 0L, SEEK_CUR) sein, der fur seinen synchroniserenden Nebeneffekt aufgerufen wird). Eine Datei im Anhange-Modus zu offnen (a als erstes Zeichen von modus) hat zur Folge, dass alle nachfolgenden Schreibaktionen in diesen Datenstrom am Dateiende erscheinen, als ob ihnen folgender Aufruf vorausgegangen ware: fseek(stream, 0, SEEK_END); Der dem Strom zugeordnete Dateideskriptor wird geoffnet, als ob ein Aufruf von open(2) mit den folgenden Schaltern stattgefunden hatte: +--------------+-------------------------------+ |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 Kurzen 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 offnet 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, andert freopen() den Modus des Datenstroms auf den in modus angegebenen, d.h. freopen() offnet den dem Pfadnamen zugeordneten Datenstrom erneut. Die Spezifikation fur dieses Verhalten wurde in dem Standard C99 hinzugefugt, bei dem es heisst: In diesem Fall muss der dem Datenstrom zugeordnete Dateideskriptor nicht geschlossen werden, falls der Aufruf von freopen() erfolgreich ist. Es ist implementierungsabhangig, welche Modusanderungen erlaubt sind (falls uberhaupt) und unter welchen Umstanden. Die primare Verwendung der Funktion freopen() ist es, die Datei zu andern, die mit einem Standard-Textdatenstrom (stderr, stdin oder stdout) verbunden ist. RUCKGABEWERT Bei erfolgreichem Abschluss geben fopen(), fdopen() und freopen() einen FILE-Zeiger zuruck. Anderenfalls wird NULL zuruckgegeben und errno dem Fehler entsprechend gesetzt. FEHLER EINVAL Der modus fur fopen(), fdopen() oder freopen() war ungultig. Die Funktionen fopen(), fdopen() und freopen() konnen auch fehlschlagen und errno wegen Fehlern setzen, die fur die Routine malloc(3) spezifiziert sind. Die Funktion fopen() kann auch fehlschlagen und errno wegen Fehlern setzen, die fur die Routine open(2) spezifiziert sind. Die Funktion fdopen() kann auch fehlschlagen und errno wegen Fehlern setzen, die fur die Routine fcntl(2) spezifiziert sind. Die Funktion freopen() kann auch fehlschlagen und errno wegen Fehlern setzen, die fur die Routinen open(2), fclose(3) und fflush(3) spezifiziert sind. ATTRIBUTE Siehe attributes(7) fur eine Erlauterung der in diesem Abschnitt verwandten Ausdrucke. +--------------------------------+-------------------------+-----------+ |Schnittstelle | Attribut | Wert | +--------------------------------+-------------------------+-----------+ |fopen(), fdopen(), freopen() | Multithread-Fahigkeit | MT-Sicher | +--------------------------------+-------------------------+-----------+ STANDARDS fopen() freopen() C11, POSIX.1-2008. fdopen() POSIX.1-2008. GESCHICHTE fopen() freopen() POSIX.1-2001, C89. fdopen() POSIX.1-2001. ANMERKUNGEN Anmerkungen zur Glibc Die C-Bibliothek von GNU erlaubt die folgenden Erweiterungen fur die in modus angegebene Zeichenkette: c (seit Glibc 2.3.3) keine >>Offnen<<-Transaktion der Thread-Annulierungspunkte, nachfolgende Lese- und Schreibaktionen oder Thread-Abbruchpunkte durchfuhren. Dieser Schalter wird bei fdopen() ignoriert. e (seit Glibc 2.7) die Datei mit dem Schalter O_CLOEXEC offnen. Siehe open(2) fur 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 fur Dateien probiert, die zum Lesen geoffnet sind. x die Datei exklusiv offnen (entspricht dem Schalter O_EXCL von open(2)). Falls die Datei bereits exisitiert, schlagt fopen() fehl und setzt errno auf EEXIST. Dieser Schalter wird fur fdopen() ignoriert. Zusatzlich zu den vorhergehenden Zeichen unterstutzen fopen() und freopen() die folgende Syntax in modus: ,ccs=zeichenkette Die angegebene Zeichenkette wird als Name eines kodierten Zeichensatzes genommen und der Datenstrom wird als an der Breite ausgerichtet gekennzeichnet. Danach wandeln interne Umwandlungsfunktionen die Ein- und Ausgaben vom und in den Zeichensatz zeichenkette um. Falls die Syntax ,ccs=zeichenkette nicht angegeben wurde, wird die Breitenausrichtung des Datenstroms durch die erste Dateitransaktion festgelegt. Falls diese Transaktion eine Wide-Charakter-Transaktion ist, wird die Zeichenkette als breitenorientiert gekennzeichnet und Funktionen zum Umwandeln des kodierten Zeichensatzes werden geladen. FEHLER Wenn der modus auf individuelle Schalterzeichen hin ausgewertet wird (d.h. die Zeichen, die der >>ccs<<-Spezifikation vorausgehen), beschrankt 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 mogliche Spezifikationen wie >>rb+cmxe<< aufzunehmen). Die aktuelle Implementierung von fdopen() wertet hochstens funf Zeichen in Modus aus. SIEHE AUCH open(2), fclose(3), fileno(3), fmemopen(3), fopencookie(3), open_memstream(3) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Patrick Rother , Chris Leick , Mario Blattermann , Dr. Tobias Quathamer und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 fopen(3)