【发布时间】:2021-01-08 18:48:46
【问题描述】:
(这可能与Why does std::basic_istream::ignore() extract more characters than specified? 重复,但我的具体情况不涉及分隔符)
来自cppreference,istream::ignore的描述如下:
从输入流中提取并丢弃字符,直到并包括 delim。
ignore 表现为 UnformattedInputFunction。在构造并检查哨兵对象后,它从流中提取字符并丢弃它们,直到出现以下任何一种情况:
- 个字符已提取。在 count 等于 std::numeric_limitsstd::streamsize::max() 的特殊情况下禁用此测试
- 文件结束条件出现在输入序列中,在这种情况下,函数调用 setstate(eofbit)
- 输入序列中的下一个可用字符 c 是 delim,由 Traits::eq_int_type(Traits::to_int_type(c), delim) 确定。分隔符被提取并丢弃。如果 delim 是 Traits::eof(),则禁用此测试
但是,假设我有以下程序:
#include <iostream>
int main(void) {
int x;
char p;
if (std::cin >> x) {
std::cout << x;
} else {
std::cin.clear();
std::cin.ignore(2);
std::cout << "________________";
std::cin >> p;
std::cout << p;
}
现在,假设我在程序启动时输入了类似p 的内容。我希望cin '失败',然后调用clear 和ignore 从缓冲区中丢弃2 个字符。所以留在缓冲区中的'p'和'\n'应该被丢弃。但是,在调用 ignore 之后,程序仍然需要输入,所以实际上它只有在我给它超过 2 个字符以丢弃后才能到达最终的 std::cin>>p。
我的问题:
输入'b'之类的内容并在第一次输入后立即按Enter(因此在字符被丢弃后的2,'p'和'\n')将'b'保留在缓冲区中并立即将其传递给cin,而无需先打印信息。我怎样才能使消息在两个字符被丢弃后立即打印,然后调用<<?
【问题讨论】:
-
总输入为 p\nb\n?
-
我忘了它,但事实证明 '\r' 也在那里,因为它是 WSL。
-
您能更清楚地了解您期望发生的事情吗?无论行尾样式如何,代码似乎都能正常运行,因为
char(b)的格式化输入将绕过ignore无论如何都错过的前导空格,leading to an output of________________b无论行尾数据和代码翻译正在发挥作用。你期待什么? -
我希望我的程序在 'p' 被给出并丢弃(以及伴随的 '\n' 或 '\r')之后等待输入(对于 'b'),但是现在,p(变量)从缓冲区中获得一个值,该值来自打印消息之前的值。 @ShadowRanger
-
@pol:因此,当您“立即”键入
p<Enter>b<Enter>(我们将忽略回车的可能性)时,您基本上希望b\n(以及缓冲区中当前可用的任何其他输入)被扔掉,只处理新的东西?也就是说,如果输入了p\n,并且在b\n之前有一个延迟,你想读取b,但是如果b从一开始就在那里,你想丢弃它并等待为了别的?