open vs fopen en C

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction fopen pour ouvrir ou créer un fichier en C
  2. Utilisez la fonction open pour ouvrir ou créer un fichier en C
  3. Utilisez la fonction creat pour ouvrir et créer un fichier
open vs fopen en C

Cet article présente plusieurs méthodes d’utilisation des fonctions open vs fopen en C.

Utilisez la fonction fopen pour ouvrir ou créer un fichier en C

fopen est la fonction de bibliothèque standard C pour gérer l’ouverture des fichiers en tant qu’objets de flux. Contrairement à la fonction open, qui est intrinsèquement un appel système, fopen associe l’objet pointeur FILE au fichier donné. Cela prend deux arguments; le premier représente un chemin vers le fichier à ouvrir, et le second argument le mode dans lequel ouvrir le fichier.

Notez que fopen a plusieurs valeurs prédéfinies pour le paramètre mode, qui sont toutes détaillées dans le manuel des fonctions page. Dans l’exemple de code suivant, nous spécifions le mode w +, qui ouvre le fichier en lecture et en écriture, en tronquant le contenu et en positionnant le flux au début. Notez que si le chemin de fonction donné n’existe pas, l’appel crée un nouveau fichier à écrire.

#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);
}

Production:

Done Writing!

Utilisez la fonction open pour ouvrir ou créer un fichier en C

En revanche, la fonction open est essentiellement un service système de niveau inférieur appelé même lorsque fopen est utilisé. Notez que les appels système sont généralement fournis aux utilisateurs finaux avec les fonctions d’encapsulation de la bibliothèque C, mais leurs caractéristiques et leurs performances d’utilisation diffèrent de celles de la bibliothèque C stio. Par exemple. open prend le deuxième argument comme type int et le troisième argument facultatif spécifiant les bits du mode fichier lorsqu’un nouveau fichier est créé. Dans l’exemple suivant, nous démontrons la fonctionnalité similaire à celle de l’exemple de code précédent.

#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);
}

L’appel open crée un nouveau descripteur de fichier et renvoie sa valeur à l’appelant; sinon, -1 est renvoyé en cas d’échec et errno est défini en conséquence. L’exemple de code suivant montre l’appel open avec l’argument de mode optionnel spécifiant S_IRWXU. Ces symboles sont des macros définies dans l’en-tête <fcntl.h> et désignent les différents drapeaux d’autorisation du fichier. S_IRWXU implique que le propriétaire du fichier aura des autorisations de lecture/écriture/exécution sur un fichier nouvellement créé.

#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);
}

Utilisez la fonction creat pour ouvrir et créer un fichier

Un autre appel système inclus avec open est la fonction creat, qui peut être spécifiquement utilisée pour créer un nouveau fichier, ou si le fichier existe déjà, le tronquer à une longueur nulle. Notez que cette fonction est essentiellement égale à l’appel open avec les arguments suivants - O_CREAT | O_WRONLY | O_TRUNC. Ainsi, il ne prend que deux arguments par rapport à open, en omettant le second argument flags.

#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);
}
Auteur: 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

Article connexe - C File