当getline直到换行才读取时会发生什么? [重复]

问题描述 投票:0回答:2

我看过很多相关的文章,但没有得到以下问题的答案。

考虑:

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

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

c++ getline
2个回答
2
投票

我们看到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()取消设置失败位。


0
投票

来自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;
© www.soinside.com 2019 - 2024. All rights reserved.