【发布时间】:2020-12-12 12:46:15
【问题描述】:
假设我的程序在不同时间需要用户输入。
我想要这个输入来防止刷新cout 缓冲区。
我可以在不同的流缓冲区上设置cin 和cout 吗?
有问题的示例:一个程序读取一行中的两个数字n1 n2,并根据第一个数字是0、1 或2:
-
n1 = 0:将第二个数字n2写入向量v -
n1 = 1:在cout中输出v[n2] -
n1 = 2:pop_back()v
MWE 是:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int size, n1, n2;
vector<int> v;
cin >> size;
while(size--){
cin >> n1;
if (n1 == 0)
{
cin >> n2;
v.push_back(n2);
}
else if (n1 == 1)
{
cin >> n2;
cout << v[n2] << '\n';
}
else if (n1 == 2)
v.pop_back();
}
return 0;
}
假设我有这个测试输入
8
0 1
0 2
0 3
2
0 4
1 0
1 1
1 2
正确的输出应该是
1
2
4
上面的程序产生了散布在输入行中的输出。
但我希望它们在结束程序时一起打印,而不使用不同的方式,例如将它们存储在某个容器等中。
所以我认为我应该对缓冲区进行操作,但是如何操作呢?
【问题讨论】:
-
std::endl总是刷新它插入的流。这就是它的工作。 -
默认情况下,
cin和cout是tie()'d 一起,因此读取输入将首先刷新任何待处理的输出。您可以致电cin.tie(nullptr)取消tie()。 -
@RemyLebeau:如果有的话,解绑的副作用是什么?
-
@Lingo 看看stackoverflow.com/questions/31162367
-
@Lingo -- 不,解绑并不能满足您的所有需求。它消除了交互式输入所需的强制刷新。它不会影响流的内部刷新。举个极端的例子,如果程序写了足够多的输出来填充输出缓冲区,那么下一次插入流将刷新缓冲区。而且您不想禁用它。