2010-11-27 4 views
2

오히려 빠른 질문을 (결코 독서를 막을 수있는 마커를 찾을 것 같다)Ifstream 무한 루프는 ...이 루프는 결코 끝나지 왜 알아낼 수 없습니다 ...

#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; 
} 

입력 파일

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 

출력 :

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 

이것은 failbit 문자를 받고 들여다의 경우인가?

+1

엿보기 전에'sourcefile >> ws;'를 추가하십시오. (# 포함) – ybungalobill

+0

그건 이상합니다. – ybungalobill

+0

실제로, 나는 명중하는 것을 잊었음에 틀림 없다, 당신의 제안은 작동했다! – superlazyname

답변

4

peek는 다음 문자를 볼 수있게 해줍니다.이 경우에는 거리 값 다음의 개행 문자입니다. Q가 아니기 때문에, 루프는 다른 세 정수 값을 읽으려고 시도하고, 실패하고, 오류 비트를 설정합니다. 엿봄, 실패가있을 때, EOF를 돌려 준다 - 그래서 당신은 결코 Q를 보지 못한다.

+0

아 ... 그게 문제 일 수 있다고 생각했습니다. 엿보기가 공백을 건너 뛰거나 아무 효과가 없었던 – superlazyname

0

파일에서 읽기 시작하기 전에 다음을 시도해 보라.

sourcefile >> std::skipws; 

줄 바꿈과 같은 공백이 무시됩니다.

+0

인지 확실하지 않았습니다. 그것은 여전히 ​​끝없이 반복되었습니다. – superlazyname