Lire le fichier ligne par ligne en utilisant fscanf en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction fscanf pour lire un fichier ligne par ligne en C
  2. Utiliser la fonction fscanf pour lire un fichier mot par mot en C
Lire le fichier ligne par ligne en utilisant fscanf 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
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