FOPEN(3)

BEZEICHNUNG
fopen, fdopen, freopen - Funktionen zum Öffnen von Datenströmen

Ü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 >= 1 || _XOPEN_SOURCE || _POSIX_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 (Diesen Sequenzen können zusätzliche Zeichen folgen.):

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) für dessen synchroniserenden Nebeneffekt sein.

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 der Aufruf
    fseek(stream,0,SEEK_END);

vorausgegangen wäre.

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.

KONFORM ZU
Die Funktionen fopen() und freopen() entsprechen C89. Die Funktion fdopen() entspricht POSIX.1-1990.

ANMERKUNGEN

  Anmerkungen zu 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«-Operation der Thread-Annulierungspunkte machen oder nachfolgende Lese- und Schreiboperationen.

e (seit Glibc 2.7)
    die Datei mit dem Schalter O_CLOEXEC öffnen. Siehe open(2) für weitere Informationen.

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.

SIEHE AUCH
open(2), fclose(3), fileno(3), fmemopen(3), fopencookie(3)

KOLOPHON
Diese Seite ist Teil der Veröffentlichung 3.27 des Projekts Linux-man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler gemeldet werden können, finden sich unter http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother <krd@gulu.net> und Chris Leick <c.leick@vollbio.de> 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 <debian-l10n-german@lists.debian.org>.