Lire le fichier binaire en C

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction fread pour lire un fichier binaire en C
  2. Utilisez la fonction read pour lire un fichier binaire en C
Lire le fichier binaire en C

Cet article présente plusieurs méthodes de lecture d’un fichier binaire en C.

Utilisez la fonction fread pour lire un fichier binaire en C

fread fait partie des fonctionnalités d’entrée/sortie de la bibliothèque standard C, et il peut être utilisé pour lire des données binaires à partir de fichiers normaux. La bibliothèque standard C implémente une E/S tamponnée par l’utilisateur avec une solution indépendante de la plate-forme pour gérer la lecture/écriture de données de fichiers binaires. Les fonctions d’E/S standard fonctionnent sur des pointeurs de fichier au lieu de descripteurs de fichier. Les flux FILE* sont récupérés par la fonction fopen, qui prend le chemin du fichier comme constante de chaîne et le mode pour les ouvrir. Le mode du fichier spécifie s’il faut ouvrir un fichier pour la lecture, l’écriture ou l’ajout. Cependant, chaque chaîne de mode peut inclure la lettre b pour spécifier explicitement le mode de fichier binaire, qui peut être interprété par certains systèmes non UNIX qui traitent différemment les fichiers texte et binaires.

Une fois que fopen a renvoyé le pointeur de fichier, nous pouvons appeler la fonction fread pour lire le flux binaire. fread prend quatre arguments, dont le premier est le pointeur void vers l’emplacement où les octets lus doivent être stockés. Les deux arguments suivants spécifient la taille et le nombre des éléments de données qui doivent être lus à partir du fichier donné. Enfin, le quatrième argument de la fonction est le pointeur FILE à partir duquel les données doivent être lues. Dans l’exemple suivant, nous ouvrons et écrivons des octets arbitraires dans le fichier nommé input.txt. Ensuite, nous fermons le fichier et l’ouvrons à nouveau pour la lecture.

#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

const uint8_t data[] = {0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72,
                        0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
                        0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x77,
                        0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74,
                        0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65};

const char* filename = "input.txt";

int main(void) {
  FILE* output_file = fopen(filename, "wb+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  fwrite(data, 1, sizeof data, output_file);
  printf("Done Writing!\n");
  fclose(output_file);

  FILE* in_file = fopen(filename, "rb");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  fread(file_contents, sb.st_size, 1, in_file);

  printf("read data: %s\n", file_contents);
  fclose(in_file);

  free(file_contents);
  exit(EXIT_SUCCESS);
}

Production:

Done Writing!
read data: Temporary string to be written to file

Utilisez la fonction read pour lire un fichier binaire en C

Alternativement, nous pouvons utiliser la fonction read qui est essentiellement un appel système sous le capot. Notez que read fonctionne sur les descripteurs de fichiers; ainsi le fichier doit être ouvert avec l’appel système open. Il prend deux arguments supplémentaires indiquant le pointeur void où les données lues seront stockées et le nombre d’octets à lire dans le fichier. Notez que nous lisons le contenu complet du fichier et lui allouons dynamiquement la mémoire à l’aide de la fonction malloc. L’appel système stat est utilisé pour trouver la taille du fichier.

#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

const uint8_t data[] = {0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72,
                        0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
                        0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x77,
                        0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74,
                        0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65};

const char* filename = "input.txt";

int main(void) {
  FILE* output_file = fopen(filename, "wb+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  fwrite(data, 1, sizeof data, output_file);
  printf("Done Writing!\n");
  fclose(output_file);

  int fd = open(filename, O_RDONLY);
  if (fd == -1) {
    perror("open\n");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  read(fd, file_contents, sb.st_size);

  printf("read data: %s\n", file_contents);
  close(fd);

  free(file_contents);

  exit(EXIT_SUCCESS);
}

Production:

Done Writing!
read data: Temporary string to be written to file
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