open vs fopen in C

Jinku Hu 12 Oktober 2023
  1. Verwendung von die Funktion fopen zum Öffnen oder Erstellen einer Datei in C
  2. Verwenden der Funktion open zum Öffnen oder Erstellen einer Datei in C
  3. Verwenden der Funktion creat zum Öffnen und Erstellen einer Datei
open vs fopen in C

In diesem Artikel werden mehrere Methoden zur Verwendung der Funktionen open vs fopen in C vorgestellt.

Verwendung von die Funktion fopen zum Öffnen oder Erstellen einer Datei in C

fopen ist die Funktion der C-Standardbibliothek für die Handhabung des Öffnens von Dateien als Stream-Objekte. Im Gegensatz zur Funktion open, die an sich ein Systemaufruf ist, verknüpft fopen das Zeigerobjekt FILE mit der angegebenen Datei. Es nimmt zwei Argumente entgegen; das erste stellt einen Pfadnamen zu der zu öffnenden Datei dar, und das zweite Argument den Modus, in dem die Datei geöffnet werden soll.

Beachten Sie, dass fopen mehrere vordefinierte Werte für den Parameter mode hat, die alle im Funktionshandbuch Seite detailliert beschrieben sind. Im folgenden Beispielcode geben wir den Modus w+ an, der die Datei zum Lesen und Schreiben öffnet, den Inhalt abschneidet und den Stream am Anfang positioniert. Beachten Sie, dass der Aufruf eine neue Datei zum Schreiben erzeugt, wenn der angegebene Funktionspfad nicht existiert.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  FILE* output_file = fopen(filename, "w+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }
  fwrite(str, 1, strlen(str), output_file);
  printf("Done Writing!\n");

  fclose(output_file);

  exit(EXIT_SUCCESS);
}

Ausgabe:

Done Writing!

Verwenden der Funktion open zum Öffnen oder Erstellen einer Datei in C

Im Gegensatz dazu ist die Funktion open im Wesentlichen ein untergeordneter Systemdienst, der auch dann aufgerufen wird, wenn fopen verwendet wird. Beachten Sie, dass Systemaufrufe den Endanwendern in der Regel mit Wrapper-Funktionen der C-Bibliothek zur Verfügung gestellt werden, aber ihre Eigenschaften und Leistungsverwendungsfälle unterscheiden sich von denen der C-Bibliothek stio. Z.B. nimmt open das zweite Argument als Typ int und ein optionales drittes Argument, das die Dateimodus-Bits angibt, wenn eine neue Datei erstellt wird. Im folgenden Beispiel demonstrieren wir die ähnliche Funktionalität wie im vorherigen Beispielcode.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = open(filename, O_RDWR | O_CREAT);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}

Der Aufruf open erzeugt einen neuen Dateideskriptor und gibt dessen Wert an den Aufrufer zurück; andernfalls wird bei einem Fehler -1 zurückgegeben und errno entsprechend gesetzt. Das nächste Codebeispiel zeigt den open-Aufruf mit dem optionalen Modus-Argument, das S_IRWXU angibt. Diese Symbole sind Makros, die im Header <fcntl.h> definiert sind und die verschiedenen Berechtigungsflags der Datei bezeichnen. S_IRWXU bedeutet, dass der Dateieigentümer Lese-, Schreib- und Ausführungsrechte für eine neu erstellte Datei hat.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = open(filename, O_CREAT | O_WRONLY | O_APPEND, S_IRWXU);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}

Verwenden der Funktion creat zum Öffnen und Erstellen einer Datei

Ein weiterer Systemaufruf, der in der Funktion open enthalten ist, ist die Funktion creat, die speziell dazu verwendet werden kann, eine neue Datei zu erstellen oder, wenn die Datei bereits existiert, auf die Länge Null abzuschneiden. Beachten Sie, dass diese Funktion im Wesentlichen dem Aufruf open mit den folgenden Argumenten entspricht - O_CREAT | O_WRONLY | O_TRUNC. Daher benötigt sie im Vergleich zu open nur zwei Argumente, wobei das zweite Flags-Argument weggelassen wird.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = creat(filename, S_IRWXG);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C File