getline()实际上是如何表现的?

时间:2011-12-20 20:44:53

标签: c++

我有两个问题:

  1. 如果我在while循环结束后再次执行“getline(in,line)”会发生什么?

    ifstream in("string.txt");
    string s, line;
    s = "";
    while(getline(in,line))
    {
    
        s = s + line + "\n";
    
    }
    
    cout<<s<<endl<<"******************************************"<<endl;
    
  2. getline()函数:每次调用它时,它是否会转到上面代码中ifstream“in”对象的“next”行?如果是这样,当while循环结束并且我再次调用相同的函数时会发生什么? (几乎与第一个问题相同,只是一个微妙的区别)

2 个答案:

答案 0 :(得分:2)

  

如果我在while循环结束后再次执行“getline(in,line)”会发生什么?

std::getline()返回类似于布尔值false的内容时,循环结束。当您查看函数的签名时,您将看到它返回流。 Streams有一个类似于布尔状态的隐式转换,类似于它们的状态。如果if(stream)将流评估为false,则表示流处于错误状态。这可能是EOF标志集或其中一个错误标志,或两者兼而有之 任何尝试使用处于错误状态的流都将失败。没有什么会被阅读。

  

getline()函数:每次调用它时,它都会转到上面代码中ifstream“in”对象的“next”行吗?如果是这样,当while循环结束并且我再次调用相同的函数时会发生什么? (几乎与第一个问题相同,只是一个微妙的差异)

这与std::getline()无关。打开文件中的位置是(文件)流的属性。每次(重新)打开文件进行读取(不传递额外参数来设置位置)时,位置设置为流(文件)的开头。

答案 1 :(得分:0)

getline读取流,直到遇到换行符或到达流的末尾。在后一种情况下,蒸汽将具有其故障点设置。这转换为打破示例中的while循环,因为getline返回(引用)流,它将被转换为bool,从而产生流的状态为false,因为上述故障排除。

在这种情况下,后续调用getline将不会执行任何操作,因为流仍处于“失败”状态。您可以使用istream::clear清除它,但由于其中没有更多数据,因此在下次读取时会再次设置其failbit。