Namespaces
Variants

fopen, fopen_s

From cppreference.net
< c ‎ | io
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,

const char * restrict mode ) ;
(2) (seit C11)
1) Öffnet eine Datei, die durch filename angegeben wird, und gibt einen Zeiger auf den Dateistrom zurück, der dieser Datei zugeordnet ist. mode wird verwendet, um den Dateizugriffsmodus zu bestimmen.
2) Gleich wie (1) , mit der Ausnahme, dass der Zeiger auf den Dateistrom in streamptr geschrieben wird und die folgenden Fehler zur Laufzeit erkannt werden und den aktuell installierten constraint handler aufrufen:
  • streamptr ist ein Nullzeiger
  • filename ist ein Nullzeiger
  • mode ist ein Nullzeiger
Wie bei allen bounds-checked-Funktionen ist fopen_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf den Integer-Konstantenwert 1 setzt, bevor <stdio.h> eingebunden wird.

Inhaltsverzeichnis

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 gibt die Funktion einen Zeiger auf den neuen Dateistrom zurück. Der Strom ist vollständig gepuffert, es sei denn, filename verweist auf ein interaktives Gerät. Im Fehlerfall wird ein Nullzeiger zurückgegeben. POSIX erfordert , dass in diesem Fall errno gesetzt wird.
2) Bei Erfolg wird Null zurückgegeben und ein Zeiger auf den neuen Dateistrom wird in * streamptr geschrieben. Bei Fehler wird ein Fehlercode ungleich Null zurückgegeben und der Nullzeiger in * streamptr geschrieben (es sei denn, streamptr ist selbst ein Nullzeiger).

Hinweise

Das Format von filename ist implementierungsdefiniert und bezieht sich nicht notwendigerweise auf eine Datei (z.B. kann es die Konsole oder ein anderes über die Dateisystem-API zugängliches Gerät sein). Auf Plattformen, die diese unterstützen, filename kann 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

  • C17-Standard (ISO/IEC 9899:2018):
  • 7.21.5.3 Die fopen-Funktion (S. 223-224)
  • K.3.5.2.1 Die fopen_s-Funktion (S. 428-429)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.21.5.3 Die fopen-Funktion (S. 305-306)
  • K.3.5.2.1 Die fopen_s-Funktion (S. 588-590)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.19.5.3 Die fopen-Funktion (S. 271-272)
  • C89/C90 Standard (ISO/IEC 9899:1990):
  • 4.9.5.3 Die fopen-Funktion

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)