繁体   English   中英

getline()的实际行为如何?

[英]How does getline() actually behave?

我有两个问题:

  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”对象的“ next”行? 如果是这样,当while循环结束并且再次调用同一函数时会发生什么? (与第一个问题几乎相同,只是细微的差别)

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

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

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

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

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

在这种情况下,由于流仍处于“失败”状态,因此随后对getline调用将无济于事。 您可以使用istream::clear清除它,但是由于其中没有更多数据,因此在下次读取时会再次设置其故障位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM