0

可能重复:
从文本文件读取直到 EOF 重复最后一行
c++ EOF 运行了太多次?

我正在编写一个简单的 c++ 代码来读取和写入二进制文件,但我发现 ifstream 将读取记录两次。我不知道这是怎么发生的,但我尝试在 windows 和 linux 中用 mingw32 编译代码,同样的情况

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

这是输出

原始数据: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 已经指出的那样,问题源于 using 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

由于当读取失败时流变坏并且可以被视为假布尔值,并且由于 read 返回流 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 回答