【问题标题】:istream::getline return typeistream::getline 返回类型
【发布时间】:2011-06-10 03:35:16
【问题描述】:

istream::getline 方法返回什么?

我之所以问,是因为我已经看到要循环遍历文件,应该这样做:

while ( file.getline( char*, int ) )
{
    // handle input
}

返回什么?

【问题讨论】:

  • 是的,我应该说我已经知道了。但显然它有些奇怪,因为某种形式的真假是从它衍生出来的。
  • 它重载了bool 或void* 运算符,因此当它在 if() 条件中被隐式强制转换时,它可以返回是否已到达 EOF

标签: c++ file-io ifstream getline istream


【解决方案1】:

它返回一个流,以便我们可以链接操作。

但是,当您在布尔上下文中使用对象时,编译器会寻找可以将其转换为可在布尔上下文中使用的类型的转换运算符。

C++11

在这种情况下,流具有explicit operator bool() const。当被调用时,它会检查错误标志。如果设置了failbit或badbit,则返回false,否则返回true。

C++03

在这种情况下,流具有operator void*() const。由于这会产生一个指针,因此它可以在布尔上下文中使用。当被调用时,它会检查错误标志。如果设置了failbit或badbit,那么它返回NULL,这相当于FALSE,否则它返回一个指向self的指针(或其他有效的东西,尽管你不应该使用这个事实)。

用法

因此,您可以在需要布尔测试的任何上下文中使用流:

if (stream >> x)
{    
}

while(stream)
{
    /* do Stuff */
}

注意:在外部测试流然后在条件/循环语句的主体内对其进行读/写是个坏主意。这是因为阅读行为可能会使流变坏。通常最好将读取作为测试的一部分进行。

while(std::getline(steam, line))
{
    // The read worked and line is valid.
}

【讨论】:

    【解决方案2】:

    从reference 看。从getline 返回的 istream 被implicit conversion 转换为 bool 以检查操作是否成功。这种转换使if(mystream.getline(a,b)) 的使用成为if(!mystream.getline(a,b).fail()) 的简写。

    【讨论】:

    • 您的链接不包含任何与您的陈述相吻合的内容。
    • @iheanyi 添加了说明,也许页面随着时间的推移发生了变化。
    【解决方案3】:

    它返回流本身。流可以(通过void*)转换为bool,指示其状态。在此示例中,您的 while 循环将在流到 bool 的转换变为“假”时终止,这发生在您的流进入错误状态时。在您的代码中,当尝试读取文件末尾时最有可能发生这种情况。简而言之,它会尽可能多地读取,然后停止。

    【讨论】:

    • +1。它可以转换为布尔值,因为它重载了operator bool()(或operator void*(),不确定是哪个)
    • @Cameron:我是operator void*()。
    【解决方案4】:

    该函数返回对流对象本身的引用,可用于链接进一步的读取操作:

    myStream.getline(...).getline(...);
    

    或者,因为流可以在循环或条件中隐式转换为void *s:

    while (myStream.getline(...)) {
        ...
    }
    

    您可以在 cplusplus.com 网站上阅读更多相关信息:

    http://cplusplus.com/reference/iostream/istream/getline/

    【讨论】:

      【解决方案5】:

      大家都告诉过你是什么,现在让我告诉你,使用free form版本

      std::string line; 
      while(getline(file, line)) // assuming file is an instance of istream
      {
      //
      }
      

      为什么是这个版本?它应该立即变得明显 - 你传入一个 std::string 而不是一些固定大小的字符缓冲区!

      【讨论】:

      • 但是如果你想要 char* 而不是 std::string 怎么办?这就是我所处的情况。
      • std::string 有c_str() 方法,它将返回您需要的内容,如果您需要修改字符串,那么您可以使用std::string 的方法来修改它。跨度>
      猜你喜欢
      • 2015-06-13
      • 1970-01-01
      • 2013-12-17
      • 2010-09-20
      • 2016-03-24
      • 2015-06-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多