我看过很多相关的文章,但没有得到以下问题的答案。
考虑:
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()
提取字符[...]直到任何发生以下情况(按所示顺序测试):
文件条件结束按输入顺序发生(在这种情况下执行
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();
:
c)已存储documentation个字符,在这种情况下
str.max_size()
设置getline
并返回。
因此超出缓冲区首先将使操作失败。
前N-1个字符将在缓冲区中,第N个字符为空终止符。
任何后续的读取尝试都将立即失败,直到手动纠正该条件(例如,重置后)。>>
failbit
示例输入/输出:
char buffer[4];
cin.getline(buffer, 4);
cout << (cin ? "" : "(failed) ") << buffer << endl;
cin.getline(buffer, 4);
cout << (cin ? "" : "(failed) ") << buffer << endl;