【问题标题】:How does getline() actually behave?getline() 的实际行为如何?
【发布时间】:2011-12-20 20:44:53
【问题描述】:

我有两个问题:

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

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

【问题讨论】:

标签: c++


【解决方案1】:

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

std::getline() 返回类似于布尔值false 时,循环结束。当您查看函数的签名时,您会看到它返回流。流具有到类似于其状态的类似布尔值的隐式转换。如果if(stream) 将流评估为false,那么这意味着流处于错误状态。这可能是设置了 EOF 标志或错误标志之一,或两者兼而有之。
任何尝试使用处于错误状态的流都将失败。什么都不会被读取。

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

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

【讨论】:

  • Nitpick: std::basic_ios::operator boolexplicit,但该语言允许在此类语句中隐式使用 explicit operator bool
  • @Caleth:十年前还没有显式的隐式转换运算符。
【解决方案2】:

getline 读取流直到遇到换行符或到达流的末尾。在后一种情况下,蒸汽将设置其故障位。这意味着在您的示例中打破while 循环,因为getline 返回(引用)流,该流被强制转换为bool,由于上述故障位,产生流的状态false

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

【讨论】:

  • 遇到流结束时不会设置失败位。在 next 调用 getline() 之后,它将设置其 eof 位。直到您读取 PAST 文件末尾才设置 EOF,最后一次成功读取将读取到文件末尾但不会过去。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 2020-07-23
  • 2011-08-08
  • 2016-10-23
  • 2015-03-22
  • 1970-01-01
  • 2015-01-06
相关资源
最近更新 更多