Pourquoi est-ce buggy code C?
-
22-09-2019 - |
Question
autre question , < a href = "https://stackoverflow.com/users/179910/jerry-coffin"> Coffin Jerry a souligné ce qui suit:
Il est (probablement) pas vraiment lié à votre question, mais
while (!feof(fileptr)){
est à peu près un bug garanti.
Je me suis dit que je commencerais une autre question puisque ce commentaire est un peu hors-sujet. Quelqu'un pourrait-il me l'expliquer? Ce fut le premier programme que je l'ai écrit en C droit devant.
La solution
La raison de cette déclaration est que feof
est toujours (d'abord) false lorsque la fin du fichier a été atteint - il ne devient vrai après la première tentative avorté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 feof
aprè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);
Autres conseils
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 ()! »
En résumé, les fonctions de fichier C comme fread
et les valeurs d'état de retour de fwrite
de toute façon que vous . Vérification de la valeur de feof
est l'un de ceux boulonnage la porte de l'écurie après que le cheval a déjà fui genre de choses.
La liste C FAQ a répondre ainsi que les réponses à beaucoup d'autres fréquemment questions posées:
En C, la routine de fin de fichier est indiqué que, après une entrée a essayé de le lire, et a échoué.