Piège avec feof

Si vous avez déjà programmé en Pascal, Perl ou certains autres language, vous risquez de mal interpréter le fonctionnement de feof().

feof ne test pas si vous êtes à la fin d'un fichier, mais si la dernière fonction de manipulation des fichiers (par ex: fscanf ou fgets) a échoué à cause de la fin du fichier. Ainsi le programme suivant affiche la dernière ligne du fichier data.txt deux fois.

Pour corriger le problème il faut effectuer le test feof(f) entre la lecture (fgets) et le printf, ou alors tester la valeur de retour de fgets (ce qui nous permet même d'enlever l'appel à feof):

#include <stdio.h>

/*
  Alok Menghrajani <alok.menghrajani@epfl.ch>
  
  Ce fichier demontre une erreur assez courante avec feof.
  En effet, la dernière ligne va être affichée deux fois.
*/

int main() {
  FILE *f = fopen("data.txt", "r");
  char s[100];
  int lignes=0;

  if (!f) {
    printf("Le fichier data.txt n'a pas pu être ouvert.\n");
    exit(1);
  }
  while (!feof(f)) {
    fgets(s, 100, f);
    printf("(%d) %s", feof(f),s);
    lignes++;
  }
  fclose(f);
  printf("\nJ'ai lu %d lignes.\n", lignes);
  return 0;
}

Voici deux versions corrigées:

...
  while (1) {
    fgets(s, 100, f);
    if (feof(f))
      break;
    printf("(%d) %s", feof(f),s);
    lignes++;
  }
...

Ou:

...
  while (fgets(s, 100, f)!=NULL) {
    printf("(%d) %s", feof(f),s);
    lignes++;
  }
...
retour à la page complément

Alok Menghrajani <alok.menghrajani@epfl.ch>