Ifstream Endlosschleife (es scheint, nie den Marker zu stoppen Lesung zu finden)
-
28-09-2019 - |
Frage
Eine eher kurze Frage ... Ich kann nicht herausfinden, warum diese Schleife nie ... endet
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
//[city1][city2][distance]
ifstream sourcefile;
int data[50][50];
sourcefile.open("a5.txt");
if(!sourcefile)
{
cout << "file not found" << endl;
return 1;
}
int temp1, temp2, temp3, check;
char reader;
check = 0;
while(reader != 'Q')
{
sourcefile >> temp1;
sourcefile >> temp2;
sourcefile >> temp3;
data[temp1][temp2] = temp3;
cout << "data[" << temp1 << "][" << temp2 << "] = " << temp3 << endl;
check++;
if(check > 100)
{
cout << "overflow" << endl;
return 1;
}
reader = sourcefile.peek();
}
return 0;
}
Die Eingabedatei
1 2 10
1 4 30
1 5 99
2 3 50
2 1 70
3 5 10
3 1 50
4 3 20
4 5 60
5 2 40
Q
Der Ausgang:
data[1][2] = 10
data[1][4] = 30
data[1][5] = 99
data[2][3] = 50
data[2][1] = 70
data[3][5] = 10
data[3][1] = 50
data[4][3] = 20
data[4][5] = 60
data[5][2] = 40
data[0][2] = 40
data[0][2] = 40
...
... (repeats "data[0][2] = 40" about 60 more times)
overflow
Ist das ein Fall von Peek einen failbit Charakter bekommen?
Lösung
Peek können Sie das nächste Zeichen zu sehen, die ich in diesem Fall denke, die Newline nach dem Entfernungswert ist. da es nicht Q ist, versucht, die Schleife noch drei ganzzahlige Werte zu lesen, fehlschlägt, und setzt das Fehlerbit. Peek, wenn es einen Fehler, kehrt EOF -., so dass Sie nie die Q zu sehen bekommen
Andere Tipps
Versuchen Sie, die folgenden, bevor sie aus der Datei zu lesen beginnen.
sourcefile >> std::skipws;
Es wird dazu führen, Leerzeichen wie Zeilenumbruch ignoriert werden.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow