Comment utiliser la fonction feof(FILE *f)?
Je vais avoir un moment difficile avec une boucle while, qui est censé arrêter
lorsque nous arrivons à la fin du fichier. Voici le code en boucle:
do {
if (pcompanyRow[0] != '#' && pass == 1) {
strtok(pcompanyRow, ":");
pcompanyName = strcpy(pcompanyName, strtok(NULL, ""));
pass = 2;
fgets(pcompanyRow, 1024, f);
}
if (pcompanyRow[0] != '#' && pass == 2) {
strtok(pcompanyRow, ":");
pcompanySMSPrice = strcpy(pcompanySMSPrice, strtok(NULL , ""));
pass = 3;
fgets(pcompanyRow, 1024 , f);
}
if (pcompanyRow[0] != '#' && pass == 3) {
strtok(pcompanyRow, ":");
pcompanyMMSPrice = strcpy(pcompanyMMSPrice, strtok(NULL, ""));
pass = 4;
fgets(pcompanyRow, 1024, f);
}
if (pass == 4) {
AppendCompanyNode(pcompanyList, pcompanyName, pcompanySMSPrice, pcompanyMMSPrice);
pass = 1;
}
} while (!feof(f));
Après avoir exécuté avec le débogueur, j'ai remarqué que tous les problèmes de blocage, c'est parce qu'il ne va pas sortir de cette boucle, même lorsqu'elle a atteint l'ensemble des lignes.
Comment dois-je l'écrire correctement?
Comme les réponses-dire, de la brièveté réponse est "Vous n'utilisez pas la fonction feof()". Le seul moment où vous utilisez la " fonction feof ()", c'est quand vous obtenez une erreur ou expressions du folklore indication à partir d'une première fonction d'entrée (
Je pense que cela fait beaucoup plus de sens pour vérifier
oui, il est plus logique d'utiliser
fgets()
par exemple) et que vous décidez que vous voulez de distinction entre les expressions du FOLKLORE et une erreur. Le plus souvent, la plupart des gens ne se soucient pas de distinction entre les deux (moi en particulier, mais la plupart du code que j'ai vu). Je ne me souviens pas de l'aide de feof()
à tous - ce qui signifie que j'ai probablement utilisé une couple de fois dans le dernier quart de siècle de la programmation en C.Je pense que cela fait beaucoup plus de sens pour vérifier
ferror(f)
plutôt que !feof(f)
si vous voulez savoir si une erreur s'est produite. Parfois feof
est utile dans les do-while, mais je suis d'accord c'est assez inutile la plupart du temps.oui, il est plus logique d'utiliser
ferror()
que feof()
, mais j'avoue que je ne les utilisent pas souvent, que ce soit. Mais je l'ai dit dans mon commentaire - ou de l'ajout d'une seconde depuis que je suis à court d'espace.OriginalL'auteur k-man | 2010-11-28
Vous devez vous connecter pour publier un commentaire.
Je voudrait changer de boucle et de la logique d'utiliser cette:
quand fgets() tente de lire au-delà de la fin du fichier, il va retourner la valeur NULL et vous allez sortir de la boucle. Vous pouvez toujours continuer à utiliser
pass
et vos autres drapeaux/la logique, mais les conditions de vérification sera légèrement différente.Je voudrais utiliser
ferror
plutôt quefeof
pour déterminer s'il y avait une erreur...c'est ce que j'ai fait..et encore il ne s'arrêtera pas! gardez à m'apporter des lignes
OriginalL'auteur poundifdef
Vous ne devriez jamais utiliser la fonction feof() comme la sortie de l'indicateur pour une boucle. feof() est VRAI qu'après la fin de fichier (EOF) est lu, et non pas lorsque EOF est atteint
Source ici. Il explique également le problème en détail et comment le résoudre.
de toute façon il l'habitude de s'arrêter!! je peux voir le pcompanyRow valeur, il prit de nouveau la première ligne, il m'apporter les lignes du fichier dans la boucle et wont stop...que puis-je faire?
+1, mais je m'interroge sur la formulation. EOF n'est jamais de "lire". Une fonction de lecture peut renvoyer des expressions du FOLKLORE en tant que résultat de la rencontre la fin du fichier, mais EOF n'est pas une valeur qui est lu.
Le code que vous l'ont souligné, montre une lecture supplémentaire d'être réalisée en raison de la fonction feof(). J'ai couru exactement le même code, je n'obtiens pas ce problème. Des idées pourquoi?
OriginalL'auteur Milan
Je suggère d'utiliser à la fois fgets() et la fonction feof().
Dernière chaîne dans le fichier pourrait avoir \n ou peut-être pas. Si vous utilisez uniquement la fonction feof(), vous pouvez sauter (perdu) de la dernière ligne.
OriginalL'auteur Andrey My