Warum ist iostream::eof innerhalb einer Schleife ist die Bedingung (D. H. " beim (!stream.eof())`) als falsch?

Ich habe gerade einen Kommentar in diese Antwort sagen, dass mit iostream::eof in einer Schleife, Bedingung ist "nahezu sicher falsch". Ich verwende in der Regel so etwas wie while(cin>>n) - ich glaube, das implizit prüft EOF.

Warum ist die überprüfung für eof explizit mit while (!cin.eof()) falsch?

Wie unterscheidet es sich von mit scanf("...",...)!=EOF in C (was ich oft verwenden, ohne Probleme)?

scanf(...) != EOF funktioniert nicht in C, weil scanf gibt die Anzahl der Felder erfolgreich analysiert und zugeordnet. Die korrekte Bedingung ist scanf(...) < n wo n ist die Anzahl der Felder in der format-string.
Voigt, es gibt eine negative Zahl ist (EOF ist normalerweise definiert als solche) im Fall von EOF erreicht ist
Tatsächlich, wird es wieder EOF wenn das Ende der Datei angetroffen wird, bevor das erste Feld Konvertierung (erfolgreich oder nicht). Wenn das Ende der Datei erreicht ist zwischen den Feldern, es wird wieder die Anzahl der Felder succcessfully umgewandelt und gespeichert. Das macht den Vergleich zu EOF falsch.
Nein, nicht wirklich. Er Irrt, wenn er sagt, dass "die Vergangenheit die Schleife gibt es keine (einfache) Weise zu unterscheiden, dass eine richtige Eingabe aus einer missbräuchlichen one". In der Tat ist es so einfach wie die überprüfung .eof() nachdem die Schleife beendet.
Ja, für diesen Fall (Lesen eines einfachen int). Aber man kann leicht kommen mit einem Szenario, in dem while(fail) Schleife beendet mit einem tatsächlichen Ausfall und ein eof. Denke, über, wenn Sie 3 ints pro iteration (sagen Sie, dass Sie Lesen eine x-y-z-Punkt oder so), aber es ist, fälschlicherweise, nur zwei ints in den Bach.

InformationsquelleAutor MAK | 2011-04-09

Schreibe einen Kommentar