fopen(3S) fopen(3S)
NAME
fopen, freopen, fdopen, fopen64, freopen64 - Stream öffnen
SYNTAX
#include <stdio.h>
FILE *fopen(const char *filename, const char *type);
FILE *freopen(const char *filename, const char *type, FILE *stream);
FILE *fdopen(int dk, const char *type);
FILE *fopen64(const char *filename, const char *mode);
FILE *freopen64(const char *filename, const char *mode, FILE *stream);
BESCHREIBUNG
fopen() öffnet die Datei mit dem Namen filename und liefert einen
Dateizeiger zurück, der auf die filename zugeordnete FILE-Struktur
zeigt. filename muß auf eine Zeichenkette zeigen, die den Namen der zu
öffnenden Datei enthält. Die gewünschte Zugriffsart geben Sie mit der
Zeichenkette type an. type kann folgende Werte annehmen:
r oder rb Datei zum Lesen öffnen
w oder wb Datei zum Schreiben auf die Länge 0 abschneiden oder
erstellen
a oder ab Anhängen; zum Schreiben am Ende der Datei öffnen
oder zum Schreiben erstellen
r+, r+b oder rb+ Datei zum Aktualisieren öffnen (Lesen und Schreiben)
w+, w+b oder wb+ Zum Aktualisieren abschneiden oder erstellen
a+, a+b oder ab+ Anhängen; zum Aktualisieren am Dateiende öffnen oder
erstellen
Das b wird in den obigen Typen ignoriert. Es ist dazu da, um binäre
Dateien von Textdateien unterscheiden zu können. Es gibt jedoch auf
einem Reliant UNIX-System keinen Unterschied zwischen diesen Dateity-
pen.
freopen() ersetzt die durch stream bezeichnete geöffnete Datei durch
die Datei, auf deren Pfadnamen filename zeigt. Zuvor wird versucht,
noch ungeschriebene Daten zu schreiben, dann wird die ursprüngliche
Datei geschlossen, unabhängig davon, ob das Öffnen schließlich erfolg-
reich ist. freopen() gibt einen Zeiger auf die FILE-Struktur zurück,
die stream zugeordnet ist.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
fopen(3S) fopen(3S)
freopen() wird normalerweise dazu verwendet, die Dateizeiger stdin,
stdout und stderr anderen Dateien zuzuordnen als den voreingestellten,
geöffneten Standarddateien. stderr ist standardmäßig nicht gepuffert,
durch die Verwendung von freopen() wird stderr jedoch gepuffert oder
zeilengepuffert.
fdopen() verknüpft einen Stream mit einem Dateideskriptor. Dateide-
skriptoren werden von open(), dup(), creat() oder pipe() geliefert.
Diese Funktionen öffnen zwar die Dateien, es werden jedoch keine Zei-
ger auf eine FILE-Struktur zurückgegeben. Fast alle der Bibliotheks-
funktionen von 3S erwarten als Eingabe einen Stream. Der Stream-Typ
muß mit der Zugriffsart der offenen Datei übereinstimmen. Der zu dem
Stream gehörende Schreib-/Lesezeiger wird auf die Position gesetzt,
die durch den Datei-Offset der zu dk gehörenden Datei angegeben ist.
Wenn eine Datei zur Aktualisierung geöffnet wird, sind sowohl Ein- als
auch Ausgabe auf dem sich ergebenden Stream zulässig. Jedoch darf der
Ausgabe keine Eingabe direkt ohne ein dazwischengesetztes fflush(),
fseek(), fsetpos() oder rewind() folgen, und der Eingabe darf keine
Ausgabe direkt folgen ohne eingefügtes fseek(), fsetpos() oder
rewind() oder einer Leseoperation, die auf das Dateiende trifft.
Wenn eine Datei zum Anhängen geöffnet wird (d. h. wenn type a, ab, a+
oder ab+ ist), ist ein Überschreiben der sich bereits in der Datei
befindenden Daten unmöglich. fseek() kann zum Umsetzen des Schreib-
/Lesezeigers auf eine beliebige Position in der Datei verwendet wer-
den, jedoch wird der aktuelle Schreib-/Lesezeiger nicht beachtet, wenn
eine Ausgabe in die Datei geschrieben wird. Alle Ausgaben werden an
das Ende der Datei geschrieben und bewirken, daß der Schreib-/Lese-
zeiger an das Ende der Ausgabe positioniert wird. Wenn zwei separate
Prozesse dieselbe Datei zum Anhängen öffnen, kann jeder Prozeß unbe-
hindert in die Datei schreiben, ohne daß ein Zerstören der vom anderen
Prozeß geschriebenen Ausgabe zu befürchten ist. Die Ausgabe von den
beiden Prozessen wird gemischt, in der Reihenfolge, in der sie
geschrieben wird, an die Datei angehängt.
Wenn ein Stream geöffnet ist, ist er dann, und zwar nur dann, voll-
ständig gepuffert, wenn sichergestellt werden kann, daß er keine Ver-
weise auf ein interaktives Gerät hat. Die Fehler- und Dateiendeanzei-
ger werden beim Öffnen für den Stream zurückgesetzt.
Der höchste in einem Objekt des Typs offt korrekt darstellbare Wert
wird als das Offset-Maximum in der internen Beschreibung der offenen
Datei festgelegt.
Es besteht kein funktionaler Unterschied zwischen fopen()/freopen()
und fopen64()/freopen64(), außer bei der Interpretation von off64t
[siehe lfs(5)].
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
fopen(3S) fopen(3S)
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
Die Funktion fopen() schlägt bei einer der folgenden Bedingungen fehl:
EACCES Eine Komponente des Pfadnamens darf nicht durchsucht
werden. Oder die Datei existiert und die durch type spe-
zifizierten Zugriffsrechte werden nicht gewährt, oder
die Datei existiert nicht und das übergeordnete Ver-
zeichnis der zu erstellenden Datei hat keine Schreiber-
laubnis.
EINTR Während der fopen()-Funktion wurde ein Signal empfangen.
EISDIR Die Datei ist ein Verzeichnis, und type verlangt
Schreiberlaubnis.
EMFILE Der Prozeß verwendet mehr als OPENMAX Dateideskriptoren
gleichzeitig.
ENAMETOOLONG Die Länge von filename überschreitet PATHMAX oder eine
Komponente des Pfadnamens ist größer als NAMEMAX.
ENFILE Die maximale Anzahl geöffneter Dateien ist erreicht. Es
können keine weiteren Dateien geöffnet werden.
ENOENT Die Datei existiert nicht oder filename weist auf eine
leere Zeichenkette.
ENOSPC Die Datei existiert nicht, und das Verzeichnis, in dem
eine neue Datei erstellt werden soll, kann nicht erwei-
tert werden.
ENOTDIR Eine Komponente des Pfadnamens ist kein Verzeichnis.
ENXIO Die Datei ist ein Gerät, auf das nicht zugegriffen wer-
den kann.
EOVERFLOW Die genannte Datei ist eine reguläre Datei, und die
Größe der Datei kann in einem Objekt des Typs offt
nicht korrekt dargestellt werden.
EROFS Die Datei befindet sich in einem Dateisystem, das nur
lesbar ist, type verlangt jedoch Schreibrechte.
Die Funktion fopen() kann bei einer der folgenden Bedingungen fehl-
schlagen:
EINVAL Der Wert des Arguments type ist ungültig.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
fopen(3S) fopen(3S)
EMFILE STREAMMAX Streams sind derzeit im aufrufenden Prozeß
geöffnet.
ENAMETOOLONG Die Auflösung des Pfadnamens eines symbolischen Links
hat ein Zwischenergebnis erzeugt, dessen Länge PATHMAX
überschreitet.
ENOMEM Es ist nicht genügend Speicherplatz verfügbar.
ETXTBSY Bei der Datei handelt es sich um eine reine Prozedurda-
tei (gemeinsam verwendete Textdatei), die nur ausgeführt
wird, und für type ist Schreibzugriff erforderlich.
Die Funktion fdopen() kann bei folgender Bedingung fehlschlagen:
EBADF Das Argument dk ist kein gültiger Dateideskriptor.
Die Funktion freopen() schlägt bei folgender Bedingung fehl:
ENXIO Bei der angegebenen Datei handelt es sich um eine
zeichen- oder blockorientierte Gerätedatei, und das die-
ser Datei zugeordnete Gerät existiert nicht.
EOVERFLOW Die genannte Datei ist eine reguläre Datei, und die
Größe der Datei kann in einem Objekt des Typs offt
nicht korrekt dargestellt werden.
ERGEBNIS
Die Funktionen fopen() und freopen() geben einen Nullzeiger zurück,
wenn auf filename nicht zugegriffen werden kann, type ungültig ist,
oder die Datei nicht geöffnet werden kann.
Die Funktion fdopen() gibt einen Nullzeiger zurück, wenn dk kein
Dateideskriptor ist, der zu einer geöffneten Datei gehört, type ungül-
tig ist, oder die Datei nicht geöffnet werden kann.
Die Funktionen fopen() oder fdopen() können scheitern, ohne errno zu
setzen, wenn es keine freien stdio(3S)-Streams gibt. Von fdopen() ver-
wendete Dateideskriptoren müssen kleiner als 255 sein.
ANWENDUNGSZWECK
STREAMMAX ist die Anzahl der Streams, die von einem Prozeß gleichzei-
tig geöffnet sein können. Falls definiert, entspricht dieser Wert
FOPENMAX.
SIEHE AUCH
close(2), creat(2), dup(2), open(2), pipe(2), write(2), fclose(3S),
fseek(3S), setbuf(3S), stdio(3S), lfs(5), stdio(5).
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98