2010-11-27 3 views
2

Eine eher kurze Frage ... ich kann nicht herausfinden, warum diese Schleife endet nie ...ifstream Endlosschleife (es scheint, nie den Marker zu finden Lesen zu stoppen)

#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 dies ein Fall von Peek einen failbit Charakter bekommen?

+1

hinzufügen 'Quelldatei >> ws;' vor dem Blick. (#include ) – ybungalobill

+0

Das ist seltsam. – ybungalobill

+0

eigentlich muss ich vergessen haben, sicher zu drücken, Ihr Vorschlag funktioniert! – superlazyname

Antwort

4

Peek können Sie das nächste Zeichen sehen, die ich in diesem Fall denke, die Newline nach dem Entfernungswert ist. Da es nicht Q ist, versucht die Schleife, drei weitere ganzzahlige Werte zu lesen, schlägt fehl und setzt das Fehlerbit. Peek, wenn es einen Fehler gibt, gibt EOF - so dass Sie nie die Frage:

+0

ah ... Ich dachte, das könnte das Problem sein. Ich war mir nicht sicher, ob Peek überspringt Whitespace oder nicht – superlazyname

0

Versuchen Sie folgendes zu sehen bekommen, bevor aus der Datei zu lesen.

sourcefile >> std::skipws; 

Es wird Leerzeichen verursachen wie Zeilenumbruch ignoriert werden.

+0

, die keine Wirkung hatte, wiederholte es immer noch endlos – superlazyname

Verwandte Themen