web-dev-qa-db-fra.com

cout << stringstream

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 ...

20
MCP

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.

22
James Kanze

Oui, vous verrez probablement l'adresse du stringstream.

Si vous souhaitez afficher la chaîne qu'il contient, essayez

cout << stream.str();
21
Bo Persson

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();
6
Goz
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.

2