我有一个循环,使用 getline()
读取文件中的每一行:
istream is;
string line;
while (!getline(is, line).eof())
{
// ...
}
我注意到像这样调用getline()
似乎也可以工作:
while (getline(is, line))
这里发生了什么?getline()
返回一个流引用。它是否被转换为指针?实际上这是一个好的做法还是我应该坚持第一种形式?
getline()
返回的istream
对象将隐式调用其操作符void*()
方法,该方法返回流是否遇到错误。因此,它进行了比调用eof()
更多的检查。< /p >查尔斯确实给出了正确的答案。
所调用的函数确实是std::basic_ios::operator void*()
,而不是sentry::operator bool()
,这与std::getline()
返回std::basic_istream
(因此是一个std::basic_ios
)而不是sentry的事实一致。
对于不信者,请参见:
否则,正如其他人已经说过的那样,建议使用第二种形式,这是规范的。只有在您真正需要冗长的代码时才使用fail()
,如果我记得不清楚是否可以使用xxx.good()
代替!xxx.fail()
。