Comment utiliser feof (FILE * f)?
-
29-09-2019 - |
Question
Je suis un moment difficile avec une boucle do-while, qui est censé arrêter lorsque nous arrivons à la fin du fichier. Voici le code de la 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, je remarque que tous les problèmes que j'ai accident sont parce qu'il ne va pas sortir de cette boucle, même quand il a atteint l'ensemble des lignes.
Comment dois-je écrire correctement?
La solution
Je changerais la boucle et la logique d'utiliser ceci:
while (fgets(pcompanyRow, 1024, f) != NULL) {
/* do things */
}
quand fgets () tente de lire après la fin du fichier, il retournera NULL et vous sortir de la boucle. Vous pouvez continuer à utiliser votre pass
et d'autres drapeaux / logique, mais les conditions vous vérifiez seront légèrement différentes.
Autres conseils
Je suggère d'utiliser les deux fgets () et feof (). Dernière chaîne dans le fichier pourrait avoir \ n ou peut-être pas. Si vous utilisez uniquement feof (), vous pouvez sauter (perdu) la dernière ligne.
for(;;)
{char *pc;
pc=fgets(buf,sizeof(buf),fd);
if(!pc)
{//it may be read error or end of file
if(feof(fd))
{//it is end of file, normal exit from for
break;
}
else
{//it is i/o error
fclose(fd);
return 2;
}
}
}//for