Question

Dans sa réponse, spécifiquement dans le Exemple d'ideone lié, @Nawaz montre comment vous pouvez modifier l'objet tampon de cout pour écrire à autre chose. Cela m'a fait penser à utiliser cela pour préparer les commentaires de cin, en remplissant son 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;
}

Mais cela ne fonctionne pas tout à fait comme prévu, ou en d'autres termes, cela échoue. : | cin s'attend toujours à la contribution des utilisateurs, au lieu de lire à partir du fourni streambuf. Existe-t-il un moyen de faire fonctionner cela?

Était-ce utile?

La solution

#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';
}

Autres conseils

Ne tenez pas compte de cette question, tout en y enquêtant plus loin, je l'ai fait fonctionner. Ce que j'ai fait était en fait l'inverse que prévu; j'ai fourni cin un streambuf lire au lieu de remplir le sien.

#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);
}

Bien qu'il serait toujours bien de voir s'il est possible de fournir une entrée préparée sans avoir à changer le cin streambuf directement, aka écrivant directement dans son tampon au lieu de le lire à partir d'un autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top