Utilisez la fonction feof en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction feof pour vérifier l’indicateur de fin de fichier sur le flux de fichiers en C
  2. Utilisez les fonctions feof et ferror pour tester la position valide du flux de fichiers en C
Utilisez la fonction feof en C

Cet article explique plusieurs méthodes d’utilisation de la fonction feof en C.

Utiliser la fonction feof pour vérifier l’indicateur de fin de fichier sur le flux de fichiers en C

La fonction feof fait partie de la bibliothèque d’entrées/sorties standard du C, définie dans l’en-tête <stdio.h>. La fonction feof vérifie l’indicateur de fin de fichier sur le flux de fichiers donné et renvoie un entier non nul si EOF est défini. Elle prend le pointeur FILE comme seul argument.

Dans l’exemple suivant, nous démontrons que le fichier est lu ligne par ligne en utilisant la fonction getline, qui est appelée jusqu’à ce que feof renvoie zéro, ce qui implique que le flux de fichiers n’a pas atteint le EOF. Notez que nous vérifions la valeur de retour de la fonction getline dans une déclaration conditionnelle, et que ce n’est qu’en cas de succès que nous appelons printf pour sortir la ligne lue.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  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* contents = NULL;
  size_t len = 0;

  while (!feof(in_file)) {
    if (getline(&contents, &len, in_file) != -1) {
      printf("%s", contents);
    }
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

Utilisez les fonctions feof et ferror pour tester la position valide du flux de fichiers en C

Alternativement, feof peut être utilisé pour tester la position du flux de fichiers avant de lire le contenu du fichier. Dans ce cas, nous lisons le fichier en utilisant l’appel fread, qui prend la taille du fichier récupéré avec l’appel de la fonction stat. Notez que le tampon pour stocker les octets lus est alloué sur le tas en utilisant la fonction malloc. De plus, nous avons inclus la fonction ferror dans la déclaration conditionnelle pour tester l’état error sur le flux de fichiers avec l’indicateur EOF.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  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);
  if (!feof(in_file) && !ferror(in_file))
    fread(file_contents, 1, sb.st_size, in_file);
  printf("read data: %s\n", file_contents);

  free(file_contents);

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

La fonction ferror fait également partie de la bibliothèque d’E/S et peut être appelée sur l’objet pointeur FILE. Il renvoie un indicateur non nul si le bit d’erreur est activé sur le flux de fichiers. Notez que les trois exemples impriment le contenu du fichier spécifié par la variable filename. Dans l’exemple de code précédent, nous produisons le contenu stocké en utilisant la fonction printf, mais la méthode la plus sujette à erreur est l’appel fwrite, qui peut imprimer le nombre d’octets donné dans le flux FILE spécifié par le quatrième argument.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  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);
  if (!feof(in_file) && !ferror(in_file))
    fread(file_contents, 1, sb.st_size, in_file);
  fwrite(file_contents, 1, sb.st_size, stdout);

  free(file_contents);

  fclose(in_file);
  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 IO