Frage

Ich habe eine harte Zeit mit einer do-while-Schleife, die zu stoppen sollten wenn wir das Ende der Datei erreichen. Hier ist die Schleife Code:

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));

Nach dem Debugger ausgeführt wird, habe ich bemerkt, dass alle die Crash-Probleme, die ich habe, weil es nicht von dieser Schleife auch nicht erlischt, wenn er die ganzen Linien erreicht.

Wie soll ich es richtig schreiben?

War es hilfreich?

Lösung

Ich würde Ihre Schleife und Logik ändern, um dies zu verwenden:

while (fgets(pcompanyRow, 1024, f) != NULL) {

    /* do things */

}

, wenn fgets () versucht, über das Ende der Datei zu lesen, wird es NULL zurück, und Sie werden von der Schleife ausbrechen. Sie können immer noch auf den Einsatz pass und Ihre anderen Flaggen / Logik weiter, aber die Bedingungen für Sie überprüfen, wird etwas anders aus.

Andere Tipps

Sie sollten nie feof () als Ausgang Indikator für eine Schleife verwenden. feof () ist TRUE erst nach dem Ende der Datei (EOF) gelesen wird, nicht, wenn EOF erreicht ist

hier . Es erklärt auch, das Problem im Detail und wie man es beheben.

Ich schlage vor, beide fgets () und feof (). Letzte Zeichenfolge in der Datei haben könnte \ n oder auch nicht. Wenn Sie nur feof () verwenden, können Sie überspringen (verloren) letzte Zeile.

 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top