4

他的回答中,特别是在链接的 Ideone 示例中,@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. 有没有办法使这项工作?

4

2 回答 2

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';
}
于 2011-05-16T06:15:49.610 回答
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直接更改,也就是直接写入其缓冲区而不是从另一个缓冲区读取。

于 2011-05-16T06:11:54.953 回答