Other Alias
fopen, freopenÜBERSICHT
#include <stdio.h>
FILE *fopen(const char *pfad, const char *modus);
FILE *fdopen(int fd, const char *modus);
FILE *freopen(const char *pfad, const char *modus, FILE *datenstrom);
Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):
fdopen(): _POSIX_C_SOURCE
BESCHREIBUNG
Die Funktion fopen() öffnet die Datei, deren Name die Zeichenkette ist, auf den pfad zeigt, und erzeugt einem 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 anfängliche Dateiposition zum Lesen ist am Dateianfang, die Ausgabe wird aber immer an das Dateiende angehängt.
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 ausschließlich aus Kompatibilitätsgründen zu C89 so und hat keinerlei Auswirkungen; das »b« wird auf allen POSIX-konformen Systemen einschließlich Linux ignoriert. (Andere Systeme könnten Text- und Binärdateien unterschiedlich behandeln und das »b« hinzuzufügen könnte sich als klug erweisen, falls Sie E/As auf die Binärdatei ausführen und erwarten, dass Ihr Programm auf Nicht-UNIX-Umgebungen portiert wird.)
Lesen Sie die folgenden ANMERKUNGEN, um Einzelheiten über Glibc-Erweiterungen für 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 geändert wurde (siehe umask(2)).
Lese- und Schreibzugriffe können in Lese-/Schreibdatenströmen in beliebiger Reihenfolge gemischt werden. Beachten Sie, dass ANSI-C verlangt, dass zwischen einer Eingabe- und einer Ausgabeoperation eine Dateipositionierungsfunktion ausgeführt wird, außer wenn eine Eingabe auf das Dateiende traf. (Falls diese Bedingung nicht eingehalten wird, darf beim Lesen etwas anderes als das zuletzt geschriebene zurückgegeben werden.) Daher ist es ein bewährtes Verfahren (und tatsächlich manchmal unter Linux nötig) eine fseek(3)- oder fgetpos-Operation zwischen Schreib- und Leseoperationen eines solchen Datenstroms einzuschieben. Diese Operation könnte der Aufruf eines scheinbaren Leerbefehls (wie z.B. fseek(…, 0L, SEEK_CUR), das für seinen synchroniserenden Nebeneffekt aufgerufen wird).
Eine Datei im Anhänge-Modus zu öffnen (a als erstes Zeichen von modus) hat zur Folge, dass alle nachfolgenden Schreiboperationen in diesen Datenstrom am Dateiende erscheinen, als ob ihnen folgender Aufruf vorausgegangen wäre:
fseek(stream, 0, SEEK_END);
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.
Die Funktion freopen öffnet die Datei, deren Name die Zeichenkette ist, auf die pfad 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. Der primäre Nutzen 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.
Die Funktionen fopen(), fdopen() und freopen() können auch fehlschlagen und errno wegen Fehlern setzen, die für die Routine malloc(3) spezifiziert sind.
Die Funktion fopen() kann auch fehlschlagen und errno wegen Fehlern setzen, die für die Routine open(2) spezifiziert sind.
Die Funktion fdopen() kann auch fehlschlagen und errno wegen Fehlern setzen, die für die Routine fcntl(2) spezifiziert sind.
Die Funktion freopen() kann auch fehlschlagen und errno wegen Fehlern setzen, die für die Routinen open(2), fclose(3) und fflush(3) spezifiziert sind.
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 |
KONFORM ZU
fopen(), freopen(): POSIX.1-2001, POSIX.1-2008, C89, 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 Schreiboperationen 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.
Zusätzlich zu den vorhergehenden Zeichen unterstützen 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), beschränkt die Glibc-Implementierung von fopen() und freopen() die Anzahl der untersuchten Zeichen in modus auf sieben (oder, in Glibc-Versionen vor 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.KOLOPHON
Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother <[email protected]>, Chris Leick <[email protected]> und Mario Blättermann <[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 <[email protected]>.