代码之家  ›  专栏  ›  技术社区  ›  Ferruccio

std::getline()返回

  •  25
  • Ferruccio  · 技术社区  · 17 年前

    我有一个循环,它使用以下命令读取文件中的每一行 getline() :

    istream is;
    string line;
    while (!getline(is, line).eof())
    {
        // ...
    }
    

    我注意到那个电话 getline() 这样似乎也有效:

    while (getline(is, line))
    

    这是怎么回事? getline() 返回流引用。它是否以某种方式被转换为指针?这实际上是一种好的做法,还是我应该坚持第一种形式?

    4 回复  |  直到 7 年前
        1
  •  27
  •   Azeem Rob Hyndman    7 年前

    这个 istream 返回由 getline() 正在安排操作员 void*() 隐式调用的方法,返回流是否遇到错误。因此,它进行的检查比打电话要多 eof() .

        2
  •  8
  •   Todd Gamblin    17 年前

    更新:

    我错误地指出了 basic_istream documentation 对于basic_istream::sentry类上的运算符bool()方法,但正如已经指出的那样,实际情况并非如此。我投票赞成查尔斯和卢克的正确答案。实际上,被调用的是运算符void*()。更多关于这个 in the C++ FAQ .

        3
  •  5
  •   Community Mohan Dere    9 年前

    查尔斯确实给了 correct answer .

    所谓的确实是 std::basic_ios::operator void*() ,而不是 sentry::operator bool() ,这与以下事实是一致的 std::getline() 返回a std::basic_istream (因此,a std::basic_ios )而不是哨兵。

    对于非信徒,请参阅:

    否则,正如其他人已经说过的,更喜欢规范的第二种形式。不要使用 fail() 如果你真的想要一个冗长的代码——我从来不记得是否 xxx.good() 可以代替 !xxx.fail()

        4
  •  -3
  •   James Eichele Bernard Igiri    17 年前

    我会坚持第一种形式。虽然第二种形式可能有效,但它很难明确。您的原始代码清楚地描述了正在进行的操作以及预期的行为方式。

    推荐文章