我有一个循环,使用getline()读取文件中的每一行
istream is;
string line;
while (!getline(is, line).eof())
{
// ...
}我注意到像这样调用getline()似乎也很有效:
while (getline(is, line))这是怎么回事?getline()返回一个流引用。是否以某种方式将其转换为指针?这实际上是一个很好的实践,还是我应该坚持第一种形式?
发布于 2008-11-03 17:02:46
getline()返回的istream将隐式调用其运算符void*()方法,该方法将返回流是否遇到错误。因此,它进行更多的检查而不是调用eof()。
发布于 2008-11-03 17:02:05
更新:
我错误地指向了basic_istream::sentry类上操作符bool()方法的basic_istream documentation,但正如前面所指出的,实际情况并非如此。我投票支持查尔斯和卢克的正确答案。实际上调用的是void*()运算符。有关此in the C++ FAQ的更多信息。
发布于 2008-11-03 18:01:34
查尔斯确实给了correct answer。
所调用的确实是std::basic_ios::operator void*(),而不是sentry::operator bool(),这与std::getline()返回std::basic_istream (因此是std::basic_ios)而不是哨兵这一事实是一致的。
对于非信仰者,请参阅:
on首选项站点上的文档,artima上的文章,
否则,就像其他人已经说过的那样,选择第二种形式,它是规范的。如果确实需要冗长的代码,请使用not fail() --我从来不记得是否可以使用xxx.good()而不是!xxx.fail()
https://stackoverflow.com/questions/259269
复制相似问题