0

Possible Duplicate:
Reading from text file until EOF repeats last line
c++ EOF running one too many times?

I am writing a simple c++ code to read and write a binary file but I found that the ifstream will read the record twice. I don't know how this happens but I try to compile the code with mingw32 in windows and linux, the same case

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

Here is the output

ORIGINAL DATA:1 1 2 2 -1

1 1 2 2 -1

1 1 2 2 -1

4

3 に答える 3

2

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

データを読み取るための慣用的なパターンは C++ です。これは次のとおりです。

while (infile.read((char *)&data[0], 5*sizeof(int)))
{  
  cout << data[0] << " " << data[1] << " "  << data[2] << " "  
       << data[3] << " "  << data[4] << endl;
}
于 2012-04-08T07:19:56.440 に答える
2

@BoPerssonがすでに指摘しているように、問題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;
于 2012-04-08T07:20:17.863 に答える
1

読み取りが失敗するとストリームが不良になり、不良ストリームは false bool と見なされる可能性があり、読み取りはストリーム istelf を返すため、次のことができます。

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

したがって、読み取りが失敗したときにループを離れます。

于 2012-04-08T07:21:37.170 に答える