Namespaces
Variants

fopen, fopen_s

Von de.cppreference.net
< c | io
 
 
Datei-Ein-/Ausgabe
Typen und Objekte
        
Funktionen
Dateizugriff
(C95)
Unformatierte Ein-/Ausgabe
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Formatierte Eingabe
Direkte Ein-/Ausgabe
Formatierte Ausgabe
Dateipositionierung
Fehlerbehandlung
Operationen auf Dateien
 
Definiert in Header <stdio.h>
FILE* fopen( const char* filename, const char* mode );
(1) (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,
                 const char* restrict mode );
(2) (seit C11)
1) Öffnet eine durch filename angegebene Datei und gibt einen Zeiger auf den mit dieser Datei verbundenen Dateistrom zurück. mode wird verwendet, um den Dateizugriffsmodus zu bestimmen.
2) Wie (1), außer dass der Zeiger auf den Dateistrom in streamptr geschrieben wird und die folgenden Fehler zur Laufzeit erkannt werden und die derzeit installierte Constraint-Handler-Funktion aufrufen:
  • streamptr ist ein Nullzeiger
  • filename ist ein Nullzeiger
  • mode ist ein Nullzeiger
Wie bei allen bounds-checked-Funktionen ist fopen_s nur dann garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert wird und der Benutzer __STDC_WANT_LIB_EXT1__ als ganzzahligen Konstanten 1 definiert, bevor er <stdio.h> einbindet.

Parameter

filename - Dateiname, der dem Dateistrom zugeordnet werden soll
mode - nullterminierte Zeichenkette, die den Dateizugriffsmodus bestimmt
streamptr - Zeiger auf einen Zeiger, in dem die Funktion das Ergebnis speichert (ein Out-Parameter)

Dateizugriffsflags

Dateizugriffsmodus-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" write Datei zum Schreiben erstellen Inhalt zerstören Neue Datei erstellen
"a" append An Datei anhängen Schreiben am Ende Neue Datei erstellen
"r+" read extended Datei zum Lesen/Schreiben öffnen Lesen ab Anfang Fehler
"w+" write extended Datei zum Lesen/Schreiben erstellen Inhalt zerstören Neue Datei erstellen
"a+" append extended Datei zum Lesen/Schreiben öffnen Schreiben am Ende Neue Datei erstellen
Dateizugriffsmodus-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 die spezielle Behandlung von ' \n ' und ' \x1A ' .
Bei den Anhänge-Zugriffsmodi werden Daten unabhängig von der aktuellen Position des Dateipositionsindikators am Ende der Datei geschrieben.
Das Verhalten ist undefiniert, wenn der Modus nicht einer der oben aufgeführten Strings ist. Einige Implementierungen definieren zusätzlich unterstützte Modi (z.B. Windows ).
Im Aktualisierungsmodus ( '+' ) können sowohl Eingabe als auch Ausgabe durchgeführt werden, aber Ausgabe kann nicht von Eingabe gefolgt werden ohne einen zwischengeschalteten Aufruf von fflush , fseek , fsetpos oder rewind , und Eingabe kann nicht von Ausgabe gefolgt werden ohne einen zwischengeschalteten Aufruf von fseek , fsetpos oder rewind , es sei denn, der Eingabevorgang hat das Dateiende erreicht. Im Aktualisierungsmodus ist es Implementierungen erlaubt, den Binärmodus zu verwenden, selbst wenn der Textmodus angegeben ist.
Dateizugriffsmodus-Flag "x" kann optional an "w" oder "w+" angehängt werden. Dieses Flag zwingt die Funktion zum Scheitern, wenn die Datei existiert, anstatt sie zu überschreiben. (C11)
Bei Verwendung von fopen_s oder freopen_s verhindern Dateizugriffsberechtigungen für jede mit "w" oder "a" erstellte Datei den Zugriff durch andere Benutzer. Dateizugriffsmodus-Flag "u" kann optional jedem Specifier vorangestellt werden, der mit "w" oder "a" beginnt, um die Standard- fopen -Berechtigungen zu aktivieren. (C11)

Rückgabewert

1) Bei Erfolg wird ein Zeiger auf den neuen Dateistrom zurückgegeben. Der Strom ist vollständig gepuffert, es sei denn, filename bezieht sich auf ein interaktives Gerät. Bei einem Fehler wird ein Nullzeiger zurückgegeben. POSIX erfordert POSIX erfordert], dass errno in diesem Fall gesetzt wird.
2) Bei Erfolg wird Null zurückgegeben und ein Zeiger auf den neuen Dateistrom in *streamptr geschrieben. Bei einem Fehler wird ein Fehlercode ungleich Null zurückgegeben und der Nullzeiger in *streamptr geschrieben (es sei denn, streamptr ist selbst ein Nullzeiger).

Anmerkungen

Das Format von filename ist implementierungsabhängig und bezieht sich nicht notwendigerweise auf eine Datei (z. B. kann es die Konsole oder ein anderes Gerät sein, das über die Dateisystem-API zugänglich ist). Auf Plattformen, die sie unterstützen, kann filename absolute oder relative Dateisystempfade enthalten.

Beispiel

#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

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.21.5.3 Die Funktion fopen (S.: TBD)
  • K.3.5.2.1 Die Funktion fopen_s (S.: TBD)
  • 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

Siehe auch

schließt eine Datei
(Funktion)
synchronisiert einen Ausgabestrom mit der tatsächlichen Datei
(Funktion)
öffnet einen bestehenden Strom mit einem anderen Namen
(Funktion)