getline()的实际行为是怎样的?

How does getline() actually behave?

本文关键字:getline      更新时间:2023-10-16

我有两个问题:

  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循环结束并再次调用相同的函数时会发生什么?(几乎和第一个问题一样,只是细微的差别)

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

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

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

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

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

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