Lire le fichier ligne par ligne en utilisant fscanf en C
-
Utiliser la fonction
fscanf
pour lire un fichier ligne par ligne en C -
Utiliser la fonction
fscanf
pour lire un fichier mot par mot en C
Cet article explique plusieurs méthodes pour lire un fichier ligne par ligne en utilisant fscanf
en C.
Utiliser la fonction fscanf
pour lire un fichier ligne par ligne en C
La fonction fscanf
fait partie des utilitaires d’entrée formatés par la bibliothèque standard C. De multiples fonctions sont fournies pour différentes sources d’entrée comme scanf
pour lire à partir de stdin
, sscanf
pour lire à partir de la chaîne de caractères, et fscanf
pour lire à partir du flux de pointeurs FILE
. Ce dernier peut être utilisé pour lire le fichier régulier ligne par ligne et les stocker dans le tampon.
fscanf prend des spécifications de formatage similaires à celles des spécificateurs printf
, et tous sont listés en détail sur cette page. Dans l’exemple suivant, nous ouvrons le fichier d’entrée en utilisant l’appel de la fonction fopen
et nous allouons de la mémoire de la taille totale du fichier pour y stocker le flux de lecture. La chaîne de format "%[^\n] "
est spécifiée pour lire le flux de fichiers jusqu’à ce que le nouveau caractère de ligne soit rencontré. fscanf
renvoie EOF
lorsque la fin de l’entrée est atteinte ; ainsi nous itérons avec la boucle while
et imprimons chaque ligne une par une.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
struct stat sb;
stat(filename, &sb);
char *file_contents = malloc(sb.st_size);
while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Production :
> Temporary string to be written to file
Notez que, même si le code précédent s’exécutera très probablement avec succès si le nom du fichier d’entrée existe dans le système de fichiers, de multiples appels de fonction peuvent néanmoins échouer et terminer le programme anormalement. L’exemple de code suivant est la version modifiée, dans laquelle les routines de vérification d’erreurs sont implémentées.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
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);
while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Production :
> Temporary string to be written to file
Utiliser la fonction fscanf
pour lire un fichier mot par mot en C
Un autre cas utile d’utilisation de la fonction fscanf
est de parcourir le fichier et d’analyser chaque jeton séparé par un espace. Notez que la seule chose à changer par rapport à l’exemple précédent est le spécificateur de format en "%[^\n ] "
. L’appel système stat
est pour récupérer la taille du fichier, et la valeur est utilisée pour passer comme argument malloc
pour allouer le tampon. Cette méthode peut être inutile dans certains cas, mais elle garantit que même les plus gros fichiers d’une seule ligne peuvent être stockés dans la mémoire tampon.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
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);
while (fscanf(in_file, "%[^\n ] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Production :
> 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