2013-01-15 40 views
8

可能重复(foobar.eof()!):
Why is iostream::eof inside a loop condition considered wrong?
eof() bad practice?为什么(foobar的>> X)优于

老师说,我们不应该使用EOF阅读文本文件或二进制文件信息,而不是我们应该使用(afile >> x)。他没有解释为什么,有人可以向我解释。也有人可以解释这两种不同的阅读方法有什么区别吗?

//Assuming declaration 
//ifstream foobar 



(! foobar.eof()) 
{ 
    foobar>>x; // This is discouraged by my teacher 

} 


while (foobar>>x) 
{ 
    //This is encouraged by my teacher 

} 
+0

[this](http://stackoverflow.com/questions/6512173/ifstream-not-reading-eof-character)以及其他许多人。 – Rapptz

回答

13

因为在尝试从中读取文件之前文件未结束。

operator>>返回它是后读取已尝试,要么是成功还是失败的状态到流的引用,流计算为true如果它成功或false如果它失败了。首先测试eof()意味着该文件中可能没有有用的数据,但尚未处于EOF状态,然后当您读取该文件时,该文件位于EOF处,并且读取失败。

另一个重要的细节是,流operator>>跳过所有前导空白,而不是尾随空白。这就是为什么在读取之前文件不能在EOF处,并且在读取之后处于EOF处。

此外,前者在文件中的下一个数据是无法读入整数的数据(例如,下一个数据是x)时工作,而不仅仅是当它位于EOF时,这非常重要。

实施例:

考虑代码:

int x, y; 

f >> x; 

if (!f.eof()) 
    f >> y; 

假设f是包含数据123␣(所述␣装置空间),所述第一读取将成功一个文件,但事后文件在EOF中没有更多的整数,它是而不是。第二次读取将失败,文件将在EOF中,但您不知道,因为您在尝试读取之前已经测试了EOF。然后,您的代码继续导致未定义的行为,因为y未初始化。

+0

你是什么意思? – Computernerd

+1

@Computernerd看我的例子。 –

+0

我喜欢你的解释。它直截了当,易于理解。 – paddy

相关问题