2010-11-27 11 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文字を取得PEEKの場合ですか?

+1

「ソースファイル」を追加してください。 (#を含む) – ybungalobill

+0

これは変です。 – ybungalobill

+0

実際には、私はセーブを忘れてしまったに違いない、あなたの提案はうまくいった! – superlazyname

答えて

4

peek次の文字を見ることができます。この場合、距離値の後の改行です。それはQではないので、ループは別の3つの整数値を読み込もうとし、失敗し、エラービットを設定します。覗いて、失敗した場合はEOFを返すので、Qを見ることはできません。

+0

ああ...私はそれが問題かもしれないと思った。覗き見が空白をスキップするかどうかわからなかった – superlazyname

0

ファイルからの読み取りを開始する前に、次のことを試してください。

sourcefile >> std::skipws; 

改行などの空白は無視されます。

+0

これは効果がなかったが、それはまだ無限に繰り返されていた – superlazyname

関連する問題