2009-10-19 8 views
3

Sur another question, Jerry Coffin a souligné ce qui suit:Pourquoi ce code C buggé?

Il est (probablement) pas vraiment lié à votre question, mais while (!feof(fileptr)){ est à peu près un bug garanti.

J'ai pensé que je commencerais une question distincte puisque ce commentaire est quelque peu hors sujet. Quelqu'un pourrait-il m'expliquer cela? C'était le premier programme que j'ai écrit en C avant.

Répondre

9

La raison de cette instruction est que feof est toujours (initialement) faux lorsque la fin du fichier a été atteinte - elle ne devient vraie qu'après la première tentative ratée de lire après la fin du fichier.

Par conséquent

char mychar; 
while(!feof(fileptr)) 
{ 
    fread(&mychar, sizeof(char), 1, fileptr); 
    fprintf(stderr, "The char is '%c'.\n", mychar); 
} 

traitera un caractère comme un trop grand nombre.

La bonne façon est de vérifier la valeur de retour de fread (ou quelle que soit la fonction que vous utilisez pour lire) ou bien appeler feofaprès la fonction qui fait la lecture. Par exemple:

char mychar; 
while(fread(&mychar, sizeof(char), 1, fileptr) > 0) 
    fprintf(stderr, "The char is '%c'.\n", mychar); 
+0

nit: le problème n'est pas que la boucle lit un char de trop, mais qu'elle en écrive un de trop. –

+0

Le diable est dans les détails ... Je suppose que c'est pour ça que nous sommes programmeurs. ;) Edité pour "traiter un caractère de trop", car c'est aussi une bonne description de ce qui se passerait dans une application réelle. –

5

Google trouve ceci: http://www.drpaulcarter.com/cs/common-c-errors.php#4.2

Il dit « ! L'auteur n'a pas encore vu tout étudiant utiliser correctement la fonction feof() »

Pour résumer, les fonctions de fichier C comme fread et fwrite valeurs d'état de retour de toute façon que vous <clin> ne devriez pas ignorer </clignotement >. Vérification de la valeur de feof est l'un de ceux qui verrouillent la porte de l'écurie après que le cheval a déjà fui le genre de choses.

+1

Donnez un court synopsis du lien dans votre réponse. Cela rend votre réponse beaucoup plus utile à un moteur de recherche. –

+2

Par une incroyable coïncidence, j'étais en train de faire exactement cela quand j'ai reçu votre communication commentée. –

+0

Apparemment, c'est aussi dans la FAQ C: http://c-faq.com/stdio/feof.html –

1

La C liste FAQ a un answer ainsi que les réponses à de nombreuses autres questions fréquemment posées:

En C, en fin de fichier est indiqué que, après une routine d'entrée a essayé de lire, et échoué.

Questions connexes