std::getline() 返回
Posted
技术标签:
【中文标题】std::getline() 返回【英文标题】:std::getline() returns 【发布时间】:2010-09-20 12:44:40 【问题描述】:我有一个循环,它使用getline()
读取文件中的每一行:
istream is;
string line;
while (!getline(is, line).eof())
// ...
我注意到像这样调用getline()
似乎也有效:
while (getline(is, line))
这里发生了什么? getline()
返回一个流引用。它是否以某种方式转换为指针?这实际上是一个好习惯还是我应该坚持第一种形式?
【问题讨论】:
【参考方案1】:getline()
返回的istream
隐式调用其运算符void*()
方法,该方法返回流是否遇到错误。因此,它比调用eof()
进行更多检查。
【讨论】:
Charles 是对的,你也对哨兵提供的运算符感到困惑。 在我写测试时删除了我的最后一篇文章。现在我很确定它会转换为 bool。 除非您的 SL 实现是非标准的,否则它会强制转换为 void*。这就是标准所要求的。 我有一份标准的在线(阅读草稿)版本。你从哪里引用?看我下面的帖子。如果我们能将这一点确定为标准中的通过,我将非常高兴是正确的。 C++0x 保留了“operator unspecified-bool-type() const;”的确切定义。未指定(§27.4.4.3/1)。 C++98 定义了“操作符 void*() const;”。如果你仔细看,没有“operator bool()const”。您误认为“basic_istream::sentry::operator bool()const”(§27.6.1.1.3/8)【参考方案2】:更新:
我错误地将 basic_istream documentation 指向 basic_istream::sentry 类上的 operator bool() 方法,但正如已经指出的那样,这实际上并不是正在发生的事情。我投票赞成查尔斯和卢克的正确答案。它实际上是被调用的操作符 void*()。更多关于这个in the C++ FAQ。
【讨论】:
您将哨兵与 basic_ios::operator void*() 混淆了 -> dinkumware.com/manuals/…*【参考方案3】:查尔斯确实给了correct answer。
调用的确实是std::basic_ios::operator void*()
,而不是sentry::operator bool()
,这与std::getline()
返回std::basic_istream
(因此是std::basic_ios
)而不是哨兵这一事实一致。
对于非信徒,请参阅:
std::basic_ios::operator void*() cppreference 网站上的文档, The Safe Bool Idiom 关于 artima 的文章, C++ FAQ lite §15.4, 标准,...否则,正如其他人已经说过的那样,更喜欢规范的第二种形式。如果你真的想要一个冗长的代码,不要使用fail()
——我不记得是否可以使用xxx.good()
代替!xxx.fail()
【讨论】:
确实如此。 dinkumware 已删除其在线文档。链接固定。谢谢。【参考方案4】:我会坚持第一种形式。虽然第二种形式可能有效,但它几乎不明确。您的原始代码清楚地描述了正在执行的操作以及预期的行为方式。
【讨论】:
不过,流可能是坏的而不是 eof()。如果要显式,可以调用 good()。 是的,你是对的。最好使用第一种形式,但调用 .good() 而不是 .eof() 我个人喜欢使用隐式强制转换为 bool。看起来所有其他语言都在迭代行。以上是关于std::getline() 返回的主要内容,如果未能解决你的问题,请参考以下文章
为啥 std::getline() 在格式化提取后跳过输入?
为啥 std::getline() 在格式化提取后跳过输入?