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 在遇到 eof 时抛出

为啥 std::getline() 在格式化提取后跳过输入?

为啥 std::getline() 在格式化提取后跳过输入?

为啥 std::getline() 在格式化提取后跳过输入?

为啥 std::getline() 在格式化提取后跳过输入?