Lire le fichier binaire en C
-
Utilisez la fonction
fread
pour lire un fichier binaire en C -
Utilisez la fonction
read
pour lire un 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
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