2017-01-26 3 views
0

In der Klasse, ich diesen Code-Schnipsel angetroffenC stdio fgets()

for (numlines = 0, (fp=fopen("thefile",'r')); feof(fp); numlines++) { 
    fgets(fp, buffer, sizeof(buffer), fp); 
    ... 
} 

In dem for-Schleife-Header, zwei Dinge, nämlich numlines und fp kann initialisiert werden, nicht wahr?

Dann im Körper der for-Schleife,

fgets(fp, buffer, sizeof(buffer), fp); 

das ist, was mich verwirrt .. Ich dachte, die fgets() Funktion

char *fgets(char *str, int n, FILE *stream) 

Jede Idee, diese Parameter nimmt, was die 2 Bilder pro Sekunde machen ?

+2

Ein Fehler? Das sollte nicht mal kompilieren. Es sei denn, der Code definiert 'fgets' neu oder tut etwas anderes (was schlecht wäre). – kaylum

+2

Das Code-Snippet ist reiner Müll, Punkt. – user3386109

+2

Wo bist du darauf gestoßen? Vielleicht war es das Ziel der Übung, die Probleme zu finden. 'feof (fp)' ist auch falsch. – Barmar

Antwort

2

Jede Idee, was die 2 Bilder pro Sekunde tun?

Es ist ein Tippfehler - der Autor hat eindeutig ihre Drähte gekreuzt, als er diese Aussage geschrieben hat. Der Compiler sollte sich über diesen Aufruf beschweren.

Es sollte auch über fp=fopen("thefile",'r') Beschwerde - das zweite Argument sollte "r", nicht 'r' sein.

Ich zähle mindestens 3 zusätzliche Probleme in diesen beiden Zeilen Code:

  • Der Autor überprüft nicht, dass der fopen Aufruf erfolgreich war, bevor sie aus der Datei zu lesen;
  • NIE Verwendung feof als Loop Zustand - es wird nicht wahr zurück, bis nach Sie versuchen, über das Ende der Datei zu lesen, werden Sie Schleife einmal Sinn zu oft, und es wird nicht fangen tatsächlicher Lesefehler;
  • Im Anschluss an das vorherige sollten Sie das Ergebnis von fgets überprüfen, um sicherzustellen, dass es erfolgreich war.

IMO, dass Code sollte als

fp = fopen("thefile", "r"); 
if (!fp) 
{ 
    // unable to open file, bail out here 
} 

for (numlines = 0; fgets(buffer, sizeof buffer, fp); numlines++) 
{ 
    // do stuff with buffer 
} 

if (feof(fp)) 
{ 
    // normal end of file 
} 
else 
{ 
    // error on read, handle as appropriate 
} 

geschrieben werden, während Sie können Anruf fopen als Teil des initializer Ausdruck in der for Schleife, Sie, dass als separate Operation tun sollten, und Stellen Sie sicher, dass es erfolgreich war vor Einstieg in die Schleife.

Überprüfen Sie das Ergebnis der fgets als Schleifenbedingung. Wenn es NULL, dann zurückgibt, überprüfen Sie, ob der Grund EOF oder ein Lesefehler war.