2010-11-27 4 views
7

Dans divers exemples sur le web fgetc() est utilisé comme ceci:fgetc(): Est-il suffisant de simplement vérifier EOF?

FILE *fp = fopen(PATH, "r"); 

if (fp == NULL) { 
    perror("main"); 
    exit(EXIT_FAILURE); 
} 

int ch; 

while (ch = fgetc(fp) != EOF) { 
    // do something 
} 

Mais selon la page de manuel à fgetc()

Si une erreur de lecture se produit, l'erreur indicateur pour le flux doit être défini, fgetc() doit renvoyer EOF, [CX] et doit définir errno pour indiquer l'erreur.

Alors, est-ce que je dois vérifier cela aussi? Et comment?

+2

Vous avez besoin de parenthèses autour de l'affectation: 'while ((ch = fgetc (fp))! = EOF)', mais avec ce correctif en place, il suffit de vérifier EOF. Vous obtiendrez EOF en cas d'erreur ou d'EOF réel; Si vous le souhaitez, vous pouvez désambiguïser les deux cas après la boucle. –

Répondre

6

Vous pouvez vérifier avec ferror (3), juste après le moment:

while (EOF != (ch = fgetc(fp))) 
    // do something 

if (ferror(fp) != 0) 
    // error handling 

ferror retourne une valeur non nulle si une erreur est survenue.

Si vous voulez utiliser fp après une erreur est survenue, vous devez effacer l'indicateur d'erreur avec clearerr:

clearerr(fp); 
+0

Mais cela sort-il de la boucle si une erreur survient? – helpermethod

+7

@Helper Méthode: Vous venez de citer cette affirmation dans votre extrait de manuel. –

4

Looping jusqu'à fgetc retours EOF est parfaitement bien. Par la suite, si vous voulez savoir si la boucle s'est terminée en raison de la fin du fichier ou d'une erreur, appelez le ferror. Si vous ne vous en souciez pas, vous pouvez passer l'appel au ferror.

4

C'est ce que les spécifications disent:

la fonction fgetc() doit obtenir l'octet suivant comme un unsigned char converti en un int

Le nom de la macro suivante sont définis comme un nombre entier négatif expression constante: EOF

tant que vous stockez la valeur de retour dans un int et non un char, il suffit de vérifier EOF parce que je t est garanti de ne pas représenter une valeur de caractère valide.


Aussi, dans votre code, ceci:

while (ch = fgetc(fp) != EOF) 

devrait être:

while ((ch = fgetc(fp)) != EOF) 

Les parenthèses supplémentaires sont nécessaires parce que != a une priorité supérieure =.