2008-11-03 64 views
25

我有一个使用getline()读取文件中每一行的循环。std :: getline()返回

istream is; 
string line; 
while (!getline(is, line).eof()) 
{ 
} 

我注意到,调用函数getline()这样也似乎工作:

while (getline(is, line)) 

这是怎么回事? getline()返回一个流引用。它以某种方式被转换为指针吗?这实际上是一种好的做法,还是应该坚持第一种形式?

回答

26

getline()返回的istream隐式调用其操作符void *()方法,该方法返回流是否已经遇到错误。因此它比eof()的调用进行更多的检查。

+0

查尔斯是对的​​,你也对哨兵提供的操作员感到困惑。 – 2008-11-03 17:42:34

8

更新时间:

我曾误指着basic_istream documentation有关basic_istream ::哨兵类运营商布尔()方法,但由于已经指出,这不是真正发生了什么。我已经投票支持查尔斯和吕克的正确答案。它实际上是运算符void *()被调用。更多关于这个in the C++ FAQ

+0

您正在混淆basic_ios :: operator void * manuals/default.aspx?manual = compleat&page = ios.html#basic_ios :: operator%20void%20 * – 2008-11-03 17:41:48

+0

好点。我也纠正了。 – tgamblin 2008-11-03 22:32:54

+1

你的链接已经死了 – qdii 2013-07-03 10:20:57

-3

我会坚持第一种形式。虽然第二种形式可能有效,但它并不明确。您的原始代码清楚地描述了正在进行的操作以及预期的操作方式。

5

Charles确实给了correct answer

什么叫确实是std::basic_ios::operator void*(),而不是sentry::operator bool(),这是洽与事实std::getline()返回std::basic_istream(因此,std::basic_ios),而不是一个哨兵。

对于非信徒,见:在cppreference网站

否则,正如其他人已经说过,更喜欢第二种形式whic h是规范的。如果真的需要详细代码,请不要使用fail() - 我永远不会记得是否可以使用xxx.good()而不是!xxx.fail()