2012-04-08 9 views
0
でファイルを読み込む

可能性の重複:
Reading from text file until EOF repeats last line
c++ EOF running one too many times?なぜC++はifstream重複レコード

私が読んで、バイナリファイルを書き込むが、私する単純なC++のコードを書いていますifstreamがレコードを2回読み取ることがわかりました。ここで

ofstream outfile; 
int data[5]; 
outfile.open("abc.out", ios::out | ios::trunc | ios::binary); 
data[0] = data[1] = 1; 
data[2] = data[3] = 2; 
data[4] = -1; 
cout << "ORIGINAL DATA:" << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << " " << data[4] << endl << endl; 
outfile.write((char *)&data[0], 5*sizeof(int)); 
outfile.close();  


ifstream infile; 
infile.open("abc.out", ios::in | ios::binary); 
data[0] = data[1] = data[2] = data[3] = data[4] = 0; 
while (!infile.eof()) 
{ 
    infile.read((char *)&data[0], 5*sizeof(int)); 
    cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << " " << data[4] << endl; 
} 

を同じケースを私はこれが起こるかわからないが、私はWindowsとLinuxでMINGW32とのコードをコンパイルしようとする出力

元のデータである:1 1 2 2 -1

1 1 2 2 -1

1 1 2 2 -1

+0

'infile.eof()'は、*読み込みに失敗した後にのみtrueを返します。そのため、ループはあまりにも多く実行されます。 –

+0

Bo Perssonに感謝しますが、私はまだそれを修正する方法を理解していません。 「テキストファイルからEOFが最後の行を繰り返すまで読む」を読むと、次のコードが試されます。 while(true){ ... if(infile.eof())break; } でもまだ動作しません – user1285419

+1

@user - coutに書き込むことを決定する前に、eofをテストしたり、 'read'(ヒント、ヒント!)の戻り値をチェックすることができます。 –

答えて

2

史上ループ条件として.eof()または.good()を使用しないでください。ほとんどの場合、バグのコードが生成されます(この場合のように)。

データを読み取るための慣用パターンはC++、このされる:@BoPerssonは既に指摘したように

while (infile.read((char *)&data[0], 5*sizeof(int))) 
{ 
    cout << data[0] << " " << data[1] << " " << data[2] << " " 
     << data[3] << " " << data[4] << endl; 
} 
2

、問題は常にエラー実質である、while (!infile.eof())を使用することから生じます。代わりに、データを読み取った結果を確認する必要があります。最初の近似は次のようになります:

// prefer 1-step initialization -- supply parameters to ctor. 
ifstream infile("abc.out", ios::in | ios::binary); 

while (infile.read((char *)&data[0], 5*sizeof(int)) 
    cout << data[0] << " " 
     << data[1] << " " 
     << data[2] << " " 
     << data[3] << " " 
     << data[4] << endl; 
+0

Jerry Coffinありがとうございました。できます :) – user1285419

1

読み取りが失敗し、悪いストリームが偽のブール値として見ることができ、リードがストリームistelfを返しますので、ときストリームは悪いを行くので、 することができます

while(infile.read((char *)&data[0], 5*sizeof(int))) 
    cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << " " << data[4] << endl; 

このようにして、読み取りの失敗時にループが残されます。

関連する問題