题
我有一个循环使用读取文件中的每一行 getline()
:
istream is;
string line;
while (!getline(is, line).eof())
{
// ...
}
我注意到打电话 getline()
这样似乎也有效:
while (getline(is, line))
这里发生了什么? getline()
返回流引用。它是否以某种方式转换为指针?这实际上是一个好的做法还是我应该坚持第一种形式?
解决方案
getline()
返回的 istream
正在隐式调用其运算符 void *()
方法,该方法返回流是否已运行陷入错误。因此,它比调用 eof()
进行更多检查。
其他提示
<强>更新强>
我错误地指出 basic_istream文档,用于basic_istream :: sentry类上的运算符bool()方法,但正如已经指出的那样,实际上并没有发生这种情况。我已经投了查尔斯和吕克的正确答案。它实际上是操作符void *()被调用。有关此在C ++常见问题解答中的更多信息。/ p>
查尔斯确实给了 正确答案.
所谓的确实是 std::basic_ios::operator void*()
, , 并不是 sentry::operator bool()
, ,这与以下事实相符 std::getline()
返回一个 std::basic_istream
(因此,一个 std::basic_ios
),而不是哨兵。
非信徒请参阅:
- std::basic_ios::运算符无效*() cppreference 站点上的文档,
- 这 安全布尔习语 关于阿蒂玛的文章,
- C++ 常见问题解答精简版§15.4,
- 标准, ...
否则,正如其他人已经说过的,更喜欢规范的第二种形式。使用不 fail()
如果你真的想要一个详细的代码——我不记得是否 xxx.good()
可以用来代替 !xxx.fail()
我会坚持使用第一种形式。虽然第二种形式可能有效,但它并不明确。您的原始代码清楚地描述了正在完成的工作以及预期的行为方式。
不隶属于 StackOverflow