如何防止 `std::cin` 或 `\n` 刷新 `std::cout` 的缓冲区?
How to prevent `std::cin` or `\n` from flushing the buffer of `std::cout`?
假设我的程序需要用户在不同时间输入。
我想要这个输入来防止刷新 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
上面的程序产生的输出散布在输入行中。
但我希望它们在结束程序时全部打印出来,而不使用不同的方式,例如将它们存储在一些容器等中
所以我想我应该对缓冲区进行操作,但是如何操作?
无需修改缓冲区。您可以将 v[n2]
存储在第二个向量中,然后在循环外部打印出来,而不是 cout << v[n2]
。
您可以写入自己的 std::stringstream
缓冲区,然后在准备就绪后将其输出到 std::cout
。
MWE:
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <vector>
using std::cin;
using std::cout;
using std::istream;
using std::runtime_error;
using std::stringstream;
using std::vector;
static auto get_int(istream& in) -> int {
int n;
if (!(in >> n)) {
throw runtime_error("bad input");
}
return n;
}
int main() {
auto ss = stringstream();
auto v = vector<int>();
auto size = get_int(cin);
while(size--) {
auto n1 = get_int(cin);
if (n1 == 0) {
auto n2 = get_int(cin);
v.push_back(n2);
} else if (n1 == 1) {
auto n2 = get_int(cin);
ss << v[n2] << '\n';
} else if (n1 == 2) {
v.pop_back();
}
}
cout << ss.str();
}
假设我的程序需要用户在不同时间输入。
我想要这个输入来防止刷新 cout
缓冲区。
我可以在不同的流缓冲区上设置 cin
和 cout
吗?
相关示例:一个程序读取一行中的两个数字 n1 n2
,并且取决于第一个数字是 0
、1
或 2
:
n1 = 0
:将第二个数字n2
写入向量v
n1 = 1
:在cout
中输出n1 = 2
:pop_back()
在v
v[n2]
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
上面的程序产生的输出散布在输入行中。
但我希望它们在结束程序时全部打印出来,而不使用不同的方式,例如将它们存储在一些容器等中
所以我想我应该对缓冲区进行操作,但是如何操作?
无需修改缓冲区。您可以将 v[n2]
存储在第二个向量中,然后在循环外部打印出来,而不是 cout << v[n2]
。
您可以写入自己的 std::stringstream
缓冲区,然后在准备就绪后将其输出到 std::cout
。
MWE:
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <vector>
using std::cin;
using std::cout;
using std::istream;
using std::runtime_error;
using std::stringstream;
using std::vector;
static auto get_int(istream& in) -> int {
int n;
if (!(in >> n)) {
throw runtime_error("bad input");
}
return n;
}
int main() {
auto ss = stringstream();
auto v = vector<int>();
auto size = get_int(cin);
while(size--) {
auto n1 = get_int(cin);
if (n1 == 0) {
auto n2 = get_int(cin);
v.push_back(n2);
} else if (n1 == 1) {
auto n2 = get_int(cin);
ss << v[n2] << '\n';
} else if (n1 == 2) {
v.pop_back();
}
}
cout << ss.str();
}