fopen, fopen_s
Von cppreference.com
| Definiert in Header <stdio.h> |
||
| (1) | ||
| FILE *fopen( const char *filename, const char *mode ); |
(bis C99) | |
| FILE *fopen( const char *restrict filename, const char *restrict mode ); |
(seit C99) | |
| errno_t fopen_s( FILE *restrict *restrict streamptr, const char *restrict filename, |
(2) | (seit C11) |
1) Öffnet eine Datei, die durch
filename angegeben ist, und gibt einen Zeiger auf den Dateistream zurück, der dieser Datei zugeordnet ist. mode wird verwendet, um den Dateizugriffsmodus zu bestimmen.2) Identisch mit (1), außer dass der Zeiger auf den Dateistream in
streamptr geschrieben wird und die folgenden Fehler zur Laufzeit erkannt und die aktuell installierte Constraint-Handler-Funktion aufgerufen wird-
streamptrist ein Nullzeiger -
filenameist ein Nullzeiger -
modeist ein Nullzeiger
-
fopen_s nur dann garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert wird und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf die ganzzahlige Konstante 1 setzt, bevor <stdio.h> eingebunden wird.Inhalt |
[bearbeiten] Parameter
| filename | - | Dateiname, dem der Dateistream zugeordnet werden soll |
| mode | - | nullterminierter Zeichenstring, der den Dateizugriffsmodus bestimmt |
| streamptr | - | Zeiger auf einen Zeiger, wohin die Funktion das Ergebnis schreibt (ein Out-Parameter) |
[bearbeiten] Dateizugriffs-Flags
| Datei-Zugriff Modus-String |
Bedeutung | Erklärung | Aktion, wenn Datei bereits existiert |
Aktion, wenn Datei nicht existiert |
|---|---|---|---|---|
| "r" | read | Datei zum Lesen öffnen | lesen ab Anfang | Fehler beim Öffnen |
| "w" | schreiben | Datei zum Schreiben erstellen | Inhalt löschen | neu erstellen |
| "a" | append | An eine Datei anhängen | Ende schreiben | neu erstellen |
| "r+" | erweitertes Lesen | Datei zum Lesen/Schreiben öffnen | lesen ab Anfang | error |
| "w+" | erweitertes Schreiben | Datei zum Lesen/Schreiben erstellen | Inhalt löschen | neu erstellen |
| "a+" | erweitertes Anhängen | Datei zum Lesen/Schreiben öffnen | Ende schreiben | neu erstellen |
| Das Dateizugriffs-Flag "b" kann optional angegeben werden, um eine Datei im Binärmodus zu öffnen. Dieses Flag hat keine Auswirkung auf POSIX-Systemen, aber unter Windows deaktiviert es spezielle Behandlungen für '\n' und '\x1A'. Bei Anhänge-Dateizugriffsmodi werden Daten am Ende der Datei geschrieben, unabhängig von der aktuellen Position des Dateipositionsindikators. | ||||
| Das Verhalten ist undefiniert, wenn der Modus keiner der oben aufgeführten Strings ist. Einige Implementierungen definieren zusätzliche unterstützte Modi (z. B. Windows). | ||||
| Im Update-Modus ('+') können sowohl Eingabe als auch Ausgabe durchgeführt werden. Nach der Ausgabe kann jedoch keine Eingabe erfolgen, ohne dass dazwischen ein Aufruf von fflush, fseek, fsetpos oder rewind erfolgt. Eine Eingabe kann nicht von einer Ausgabe gefolgt werden, ohne einen dazwischenliegenden Aufruf von fseek, fsetpos oder rewind, es sei denn, die Eingabeoperation hat das Dateiende erreicht. Im Update-Modus dürfen Implementierungen den Binärmodus verwenden, auch wenn der Textmodus angegeben ist. | ||||
| Das Dateizugriffs-Flag "x" kann optional an "w" oder "w+" angehängt werden. Dieses Flag erzwingt, dass die Funktion fehlschlägt, wenn die Datei existiert, anstatt sie zu überschreiben. (C11) | ||||
| Bei der Verwendung von fopen_s oder freopen_s verhindern die Dateizugriffsberechtigungen für jede mit "w" oder "a" erstellte Datei, dass andere Benutzer darauf zugreifen können. Das Dateizugriffs-Flag "u" kann optional jeder Spezifikation vorangestellt werden, die mit "w" oder "a" beginnt, um die Standardberechtigungen von fopen zu aktivieren. (C11) | ||||
[bearbeiten] Rückgabewert
1) Bei Erfolg wird ein Zeiger auf den neuen Dateistream zurückgegeben. Der Stream ist vollständig gepuffert, es sei denn,
filename bezieht sich auf ein interaktives Gerät. Bei einem Fehler wird ein Nullzeiger zurückgegeben. POSIX verlangt, dass errno in diesem Fall gesetzt wird.2) Bei Erfolg wird Null zurückgegeben und ein Zeiger auf den neuen Dateistream in *streamptr geschrieben. Bei einem Fehler wird ein von Null verschiedener Fehlercode zurückgegeben und Null in *streamptr geschrieben (es sei denn,
streamptr ist selbst ein Nullzeiger).[bearbeiten] Hinweise
Das Format von filename ist implementierungsabhängig und bezieht sich nicht unbedingt auf eine Datei (z. B. kann es sich um die Konsole oder ein anderes Gerät handeln, das über die Dateisystem-API zugänglich ist). Auf Plattformen, die sie unterstützen, kann filename einen absoluten oder relativen Dateisystempfad enthalten.
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#include <stdio.h> #include <stdlib.h> int main(void) { const char* fname = "/tmp/unique_name.txt"; // or tmpnam(NULL); int is_ok = EXIT_FAILURE; FILE* fp = fopen(fname, "w+"); if (!fp) { perror("File opening failed"); return is_ok; } fputs("Hello, world!\n", fp); rewind(fp); int c; // note: int, not char, required to handle EOF while ((c = fgetc(fp)) != EOF) // standard C I/O file reading loop putchar(c); if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) { puts("End of file is reached successfully"); is_ok = EXIT_SUCCESS; } fclose(fp); remove(fname); return is_ok; }
Mögliche Ausgabe
Hello, world! End of file is reached successfully
[bearbeiten] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 7.21.5.3 Die Funktion fopen (S. 223–224)
- K.3.5.2.1 Die Funktion fopen_s (S. 428–429)
- C11-Standard (ISO/IEC 9899:2011)
- 7.21.5.3 Die Funktion fopen (S. 305–306)
- K.3.5.2.1 Die Funktion fopen_s (S. 588–590)
- C99-Standard (ISO/IEC 9899:1999)
- 7.19.5.3 Die Funktion fopen (S. 271–272)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 4.9.5.3 Die Funktion fopen
[bearbeiten] Siehe auch
| schließt eine Datei (Funktion) | |
| synchronisiert einen Ausgabestream mit der tatsächlichen Datei (Funktion) | |
| (C11) |
öffnet einen existierenden Stream mit einem anderen Namen (Funktion) |
| C++ Dokumentation für fopen
| |