.eof () - Schleife funktioniert nicht
Ich versuche zu Lesen in zahlen aus einer Datei und legt diese in ein array. Jetzt wenn ich das Programm druckt es 8 zahlen, dann ist die Zeile endet und Drucke die gleichen 8 zahlen. Es ist in einer nie endenden Schleife. Was mache ich falsch?
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int num;
ifstream infile;
infile.open("euler8Nums.txt");
infile >> num;//must attempt to read info prior to an eof() test
while(!infile.eof()){
cout << num << endl;
infile >> num;
}
infile.close();
return 0;
}
mögliche Duplikate von ifstream nicht Lesen-EOF-Zeichen
InformationsquelleAutor Sean | 2012-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen nicht verwenden
.eof()
oder.bad()
. Nur überprüfen Sie den Zustand der stream selbstDas eof-flag wird nicht gesetzt, wenn der Strom ausfällt, zu analysieren Eingang, und dann der stream nicht mehr zu bedienen, bis der Status ist deaktiviert. Wenn Sie überprüft
bad
statt, es würde gehen, bis Sie es versäumt, zu analysieren, würde aber bug aus auf die EOF. Also nur überprüfen, ob der stream noch.good()
(was implizit ist, wenn es in einer while-Schleife).In Ihrem Fall, es ist eine unendliche Schleife, da die Datei nicht öffnen und dann Sie versuchen, die zahlen zu Lesen, aber die Lektüre tut nichts, weil die Datei nicht geöffnet. Damit es nie liest die
eof
, also Endlosschleife.Richtig, weil es andernfalls zu Lesen. Dein code auch konnte nicht Lesen, aber Sie wusste es nicht. Ihre Datei entweder (A) nicht öffnen, oder (B) nicht
int
s innen. Wahrscheinlich andernfalls zu öffnen.Beachten Sie, dass Sie
is_open()
zu überprüfen, ob die Datei wurde erfolgreich geöffnet. Sie können auchgood()
um sicherzustellen, dasseof
,failbit
, undbadbit
sind alle nicht gesetzt.oder
if (infile) //it's good
InformationsquelleAutor Mooing Duck
Ich weiß nicht, was die Datei enthält, oder, wie es würde eine unendliche Schleife verursachen, drucken mehr als die Letzte Zahl. Jedoch, die
eof()
bit ist nur gut für die Fehlerberichterstattung abernot
für loop-Steuerung. Da gibt es auch eine Menge anderer Sachen in den code, das ist völlig unnötig. Das folgende Programm Lesen sollten die zahlen OK:Ich sah noch nie einen Punkt in Berufung
open()
getrennt, es sei denn, es ist eine bedingte notwendig, bevor der Datei-name kann bearbeitet werden. Ebenso ruftclose()
explizit scheint ziemlich sinnlos, es sei denn, Sie möchten überprüfen, ob das schließen erfolgreich war (obwohl ich bin mir nicht sicher, obclose()
auf einen input-stream eine Gelegenheit hat, zu scheitern).Anderen meiner Haustier ärgert, ist die unnötige Verwendung von
std::endl
: dieser manipulator ist eine relativ häufige Ursache für eine schlechte Leistung! Es macht zwei Dinge:\n
(oder wide-character-streams der Folge der Ausweitung dieses Zeichen).Nur Spülen Sie den stream, wenn Sie wirklich bedeuten. Wenn Sie denken, Sie brauchen zusätzliche Leerungen auf dem stream, z.B., wenn Sie versuchen zu finden, was geschrieben steht rechts vor einem Absturz, setzen Sie einfach
std::unitbuf
auf das stream-Objekt: das wird noch schlimmer, aus einem performance-Sicht, weil es spült den stream nach jedem einfügen, aber es wird leicht entfernt werden, sobald das problem liegt.Natürlich, das resultierende Programm kann geändert werden, um auch noch einmal etwas übersichtlicher wie
InformationsquelleAutor Dietmar Kühl