Est-il possible de «préparer» la contribution de CIN?
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?
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.