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