Quand je mets quelque chose dans un stringstream, disons un vrai nombre, si j'insère ensuite cet objet stringstream dans cout ... qu'est-ce que je regarde?
Habituellement, j'obtiens un chiffre étrange. S'agit-il d'un emplacement mémoire? Juste curieux.
Il semble que le commentaire ci-dessous l'a frappé, mais voici ce que j'essaie de faire:
string stringIn;
stringstream holdBuff;
holdBuff << getline(cin, stringIn);
cout << holdBuff;
Fondamentalement, j'essayais juste de voir à quoi ressemblait holdBuff une fois que j'ai inséré stringIn. J'essaie de faire entrer une chaîne par l'utilisateur, puis je veux la parcourir en recherchant son contenu et en la convertissant éventuellement ...
Qu'est-ce que tu penses
holdBuff << getline(cin, stringIn);
fait. Le type de retour de getline
est une référence au flux en cours de lecture (cin
) dans ce cas. Puisqu'il n'y a pas de <<
défini qui prend un std::istream
comme deuxième argument, le compilateur essaie différentes conversions: en C++ 11, std::istream
a une conversion implicite en bool
, et dans les versions antérieures de C++, une conversion implicite en std::ios*
, ou quelque chose de similaire (mais la seule utilisation valide de la valeur renvoyée est de la convertir en bool
). Vous allez donc soit sortir 1
(C++ 11), ou une adresse aléatoire (en pratique, généralement l'adresse du flux, mais ce n'est pas garanti). Si vous souhaitez obtenir les résultats d'un appel à getline
dans un std::ostringstream
, vous avez besoin de deux opérations (avec une vérification des erreurs entre elles):
if ( !getline( std::cin, stringIn ) )
// Error handling here...
holdBuff << stringIn;
De même, pour écrire le contenu d'un std::ostringstream
,
std::cout << holdBuf.str() ;
est la bonne solution. Si vous insistez pour utiliser un std::stringstream
lorsqu'un std::ostringstream
serait plus approprié, vous pouvez aussi faire:
std::cout << holdBuf.rdbuf();
La première solution est cependant préférable, car elle est beaucoup plus idiomatique.
Dans tous les cas, encore une fois, il n'y a pas de <<
opérateur qui accepte n'importe quel type iostream
, vous obtenez donc les résultats de la conversion implicite en bool
ou un pointeur.
Oui, vous verrez probablement l'adresse du stringstream.
Si vous souhaitez afficher la chaîne qu'il contient, essayez
cout << stream.str();
Oui, il s'agit très probablement d'un emplacement mémoire d'une forme ou d'une autre. Il s'agit très probablement du pointeur sur l'objet stringstream lui-même.
Vous pouvez le confirmer comme suit:
std::stringstream ss;
unsigned long long ll = (unsigned long long)&ss;
cout << ll;
Cela dit, lorsque vous souhaitez créer un flux de chaînes, vous devez utiliser la fonction str () comme suit:
cout << ss.str();
cout << s.rdbuf();
c'est ce que tu veux. Vous pouvez également souhaiter
count << s.str();
qui peut être plus cher en termes de ressources.