在his answer中,特别是在linked Ideone example中,@ Nawaz显示了如何更改cout
的缓冲区对象以写入其他内容。这让我想到利用它来准备cin
的输入,填写streambuf
:
#include <iostream>
#include <sstream>
using namespace std;
int main(){
streambuf *coutbuf = cout.rdbuf(cin.rdbuf());
cout << "this goes to the input stream" << endl;
string s;
cin >> s;
cout.rdbuf(coutbuf);
cout << "after cour.rdbuf : " << s;
return 0;
}
但是这并没有像预期的那样奏效,换句话说,它失败了。 :| cin
仍然需要用户输入,而不是从提供的streambuf
读取。有没有办法使这项工作?
答案 0 :(得分:4)
#include <iostream>
#include <sstream>
int main()
{
std::stringstream s("32 7.4");
std::cin.rdbuf(s.rdbuf());
int i;
double d;
if (std::cin >> i >> d)
std::cout << i << ' ' << d << '\n';
}
答案 1 :(得分:3)
无视这个问题,在进一步调查的同时,我让它发挥了作用。我所做的实际上是另一种方式而非计划;我提供cin
一个streambuf
来阅读,而不是填写自己的。
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main(){
stringstream ss;
ss << "Here be prepared input for cin";
streambuf* cin_buf = cin.rdbuf(ss.rdbuf());
string s;
while(cin >> s){
cout << s << " ";
}
cin.rdbuf(cin_buf);
}
虽然在不必直接更改cin
streambuf
的情况下查看是否可以提供准备好的输入仍然很好,但是直接写入其缓冲区而不是从另一个读取它