2012-04-08 86 views
0
文件

可能重复:
Reading from text file until EOF repeats last line
c++ EOF running one too many times?为什么C++ ifstream的读取与重复记录

我写一个简单的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

+0

'infile.eof()'只*后返回true *无法读取,因此该循环运行一次太多。 – 2012-04-08 07:06:02

+0

谢谢博佩尔松,但我还是不知道如何解决这个问题。读“从文本文件中读取直到EOF重复最后一行”,我尝试下面的代码 而(真){ ... 如果(infile.eof())破; } 但仍然无法正常工作 – user1285419 2012-04-08 07:09:29

+1

@user - 您可以测试EOF,或检查read'的'的返回值,决定写信给COUT之前(暗示,暗示!)。 – 2012-04-08 07:13:50

回答

2

千万不要使用.eof().good()作为循环条件。它几乎总是产生bug的代码(因为它在这种情况下一样)。

用于读取数据的惯用模式是C++是这样的:

while (infile.read((char *)&data[0], 5*sizeof(int))) 
{ 
    cout << data[0] << " " << data[1] << " " << data[2] << " " 
     << data[3] << " " << data[4] << endl; 
} 
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; 
+0

谢谢了很多杰里棺材。有用 :) – user1285419 2012-04-08 07:24:42

1

由于流进当读取失败和流可以被看作是一个虚假的布尔,由于读取返回流istelf, 你可以这样做

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

因此只留下读取失败的循环。