2010-11-28 15 views
2

Ich habe eine harte Zeit mit einer Do-While-Schleife, die stoppen soll, wenn wir das Ende der Datei erreichen. Hier ist der Schleifencode:Wie verwende ich feof (FILE * f)?

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

Nachdem mit dem Debugger ausgeführt wird, bemerkte ich, dass alle Crash-Probleme, die ich habe, weil es nicht aus dieser Schleife geht, auch wenn es die ganzen Linien erreicht.

Wie soll ich es richtig schreiben?

+1

Wie die Antworten sagen, ist die prägnante Antwort "Sie verwenden nicht feof()". Das einzige Mal, wenn Sie 'feof()' verwenden, ist, wenn Sie eine Fehler-oder-EOF-Angabe von einer primären Eingabefunktion erhalten (z. B. "fgets()") und Sie entscheiden, zwischen EOF und einem Fehler zu unterscheiden. Meistens machen sich die meisten Leute nicht die Mühe, zwischen den beiden zu unterscheiden (ich speziell, aber den größten Teil des Codes, den ich gesehen habe). Ich kann mich nicht erinnern, 'feof()' überhaupt zu benutzen - was bedeutet, dass ich es wahrscheinlich ein paar Mal im letzten Vierteljahrhundert der C-Programmierung benutzt habe. –

+0

@ Jonathan: Ich denke, es ist viel sinnvoller, 'ferror (f)' als '' feof (f) 'zu überprüfen, wenn Sie wissen wollen, ob ein Fehler aufgetreten ist. Manchmal ist 'feof' in Do-While-Loops nützlich, aber ich stimme zu, dass es meistens ziemlich nutzlos ist. –

+0

@R ..: Ja, es macht mehr Sinn, 'ferror()' als 'feof()' zu benutzen, aber ich gestehe, dass ich das auch nicht oft benutze. Aber ich hätte das in meinem Kommentar sagen sollen - oder einen zweiten hinzugefügt, da mir der Platz ausging. –

Antwort

4

würde ich Ihre Schleife und Logik ändern, um dies zu nutzen:

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

    /* do things */ 

} 

wenn fgets() versucht, über das Ende der Datei zu lesen, wird es geben NULL zurück, und Sie werden aus der Schleife brechen. Sie können weiterhin pass und Ihre anderen Flags/Logik verwenden, aber die Bedingungen, nach denen Sie suchen, unterscheiden sich geringfügig.

+0

Sobald die Schleife abgeschlossen ist, können Sie feof (f) verwenden, um festzustellen, ob es EOF oder ein Fehler war – EvilTeach

+0

Ich würde 'ferror' anstelle von' feof' verwenden, um festzustellen, ob es einen Fehler gab ... –

+0

das ist, was ich getan habe ..und noch wird es nicht aufhören! bring mir immer Linien –

8

Sie sollten nie feof() als Exit-Indikator für eine Schleife verwenden. feof() ist nur dann TRUE, wenn das Ende der Datei (EOF) gelesen wurde, nicht, wenn EOF erreicht wurde

Quelle here. Es erklärt auch das Problem im Detail und wie es zu beheben ist.

+0

ich änderte die while zu dem: while (fgets (pcompanyRow, 1024, f)! = NULL) –

+0

sowieso wird es nicht aufhören !! Ich kann den pcompanyRow-Wert sehen, es dauerte wieder die erste Zeile, es bringt mir die Dateizeilen in Schleife und nicht aufhören ... was kann ich tun? –

+1

+1, aber ich frage den Wortlaut. EOF wird niemals "gelesen". Eine Lesefunktion kann EOF als Ergebnis des Endes der Datei zurückgeben, aber EOF ist kein Wert, der gelesen wird. –