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?

Était-ce utile?

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

Vous ne devez jamais utiliser feof () comme l'indicateur de sortie pour une boucle. feof () est vrai que, après la fin du fichier (EOF) est lu, pas quand EOF est atteint

Source . Il explique également en détail le problème et comment le résoudre.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top