我有一个循环使用getline()
读取文件中的每一行:
istream is;
string line;
while (!getline(is, line).eof())
{
// ...
}
我注意到这样调用getline()
似乎也有效:
while (getline(is, line))
这里发生了什么? getline()
返回流引用。是以某种方式转换为指针?这实际上是一个好习惯还是我应该坚持第一种形式?
答案 0 :(得分:27)
istream
返回的getline()
正在隐式调用其运算符void*()
方法,该方法返回流是否遇到错误。因此,它比调用eof()
进行更多检查。
答案 1 :(得分:8)
<强>更新强>
我错误地指出了basic_istream documentation对于basic_istream :: sentry类上的运算符bool()方法,但正如已经指出的那样,实际上并不是发生了什么。我已经投了查尔斯和吕克的正确答案。它实际上是操作符void *()被调用。有关in the C++ FAQ的更多信息。
答案 2 :(得分:5)
Charles确实给了correct answer。
所谓的确是std::basic_ios::operator void*()
,而不是sentry::operator bool()
,这与std::getline()
返回std::basic_istream
的事实是一致的(因此,std::basic_ios
),而不是哨兵。
对于非信徒,请参阅:
否则,正如其他人已经说过的那样,更喜欢规范的第二种形式。如果你真的想要一个详细的代码,请不要使用fail()
- 我永远不会记得是否可以使用xxx.good()
代替!xxx.fail()
答案 3 :(得分:-3)
我会坚持使用第一种形式。虽然第二种形式可能有效,但它并不明确。您的原始代码清楚地描述了正在完成的工作以及预期的行为方式。