【问题标题】:What happens when getline does not read until new line? [duplicate]当 getline 直到换行才读取时会发生什么? [复制]
【发布时间】:2020-01-15 10:20:08
【问题描述】:

我看过不少相关帖子,但没有得到以下问题的答案。

考虑:

char buffer[4];
cin.getline(buffer, 4);
cout << buffer << endl;
cin.getline(buffer, 4);
cout << buffer << endl;

如果我在输入时输入abc,我就有机会输入第二行,并且这两行都正确显示在输出中。但是,如果我输入 abcd 或者,就此而言,任何超过三个字符的内容,我都无法输入第二行并且第二行输出为空。到底发生了什么?

【问题讨论】:

标签: c++ getline


【解决方案1】:

我们看到std::basic_istream&lt;CharT,Traits&gt;::getline()

提取字符 [...] 直到任何 发生以下情况(按所示顺序测试):

  • 文件结束条件出现在输入序列中(在这种情况下会执行setstate(eofbit)

  • 下一个可用字符c 是分隔符,由Traits::eq(c, delim) 确定。分隔符被提取(不像 basic_istream::get()) 并计入gcount(),但不存储。

  • count-1 字符已被提取(在这种情况下,setstate(failbit) 被执行)。

如果函数没有提取字符(例如,如果count &lt; 1), setstate(failbit) 被执行。

在任何情况下,如果是count&gt;0,它会将一个空字符CharT() 存储到 数组的下一个连续位置并更新gcount()

在我们的例子中,因为我们为存储输入了太多字符,所以我们遇到了第三个条件,并且在流上设置了失败位。

可以使用std::cin.clear() 取消设置失败位。

【讨论】:

  • 放置cin.clear() 解决了问题,因此第二个getline 继续读取第一个未完全读取的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2019-09-23
  • 2018-04-08
  • 1970-01-01
  • 2018-04-21
相关资源
最近更新 更多