当 getline 直到新行才读取时会发生什么?

What happens when getline does not read until new line?

本文关键字:什么 读取 getline 新行      更新时间:2023-10-16

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

考虑:

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

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

我们看到std::basic_istream<CharT,Traits>::getline()

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

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

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

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

如果函数不提取任何字符(例如,如果count < 1(,setstate(failbit)被执行。

无论如何,如果count>0,它会存储一个空字符CharT()数组的下一个连续位置,并更新gcount()

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

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

相关文章: