Можно ли "подготовить" вход из cin? - PullRequest
4 голосов
/ 16 мая 2011

В своем ответе , в частности в связанном примере 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.Есть ли способ сделать эту работу?

Ответы [ 2 ]

4 голосов
/ 16 мая 2011
#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';
}
3 голосов
/ 16 мая 2011

Не обращая внимания на этот вопрос, продолжая его исследовать, я заставил его работать.То, что я сделал, было на самом деле наоборот, чем планировалось;Я предоставил cin a 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);
}

Хотя было бы неплохо увидеть, можно ли предоставить подготовленный ввод без необходимости изменять cinstreambuf напрямую, то есть запись в свой буфер напрямую вместо чтения из другого.

...