J'ai déjà essayé plusieurs choses,
std::stringstream m;
m.empty();
m.clear();
qui ne fonctionnent pas.
J'ai déjà essayé plusieurs choses,
std::stringstream m;
m.empty();
m.clear();
qui ne fonctionnent pas.
Réponses:
Pour tous les types de bibliothèques standard, la fonction membre empty()
est une requête, pas une commande, c'est-à-dire qu'elle signifie "êtes-vous vide?" pas "veuillez jeter votre contenu".
La clear()
fonction membre est héritée de ios
et est utilisée pour effacer l'état d'erreur du flux, par exemple si un flux de fichiers a l'état d'erreur défini sur eofbit
(fin de fichier), alors l'appel clear()
rétablira l'état d'erreur sur goodbit
(pas d'erreur) .
Pour effacer le contenu d'un stringstream
, en utilisant:
m.str("");
est correct, bien qu'en utilisant:
m.str(std::string());
est techniquement plus efficace, car vous évitez d'appeler le std::string
constructeur qui prend const char*
. Mais n'importe quel compilateur de nos jours devrait être capable de générer le même code dans les deux cas - je choisirais donc tout ce qui est plus lisible.
Vous pouvez effacer l'état d'erreur et vider le train de chaînes sur une seule ligne
std::stringstream().swap(m); // swap m with a default constructed stringstream
Cela réinitialise effectivement m à un état construit par défaut
m.str("");
semble fonctionner.
Cela devrait être le moyen le plus fiable quel que soit le compilateur:
m=std::stringstream();
mm.clear(); mm.str("");
fait l'affaire. (pas de C ++ 11, sinon le swap serait mieux).
swap
il préférable à l'affectation de mouvement?
mes 2 cents:
cela semblait fonctionner pour moi dans xcode et dev-c ++, j'avais un programme sous la forme d'un menu qui, s'il était exécuté de manière itérative à la demande d'un utilisateur, remplirait une variable stringstream qui fonctionnerait bien la première fois que le code le ferait exécuter mais n'effacera pas le flux de chaînes la prochaine fois que l'utilisateur exécutera le même code. mais les deux lignes de code ci-dessous ont finalement effacé la variable stringstream à chaque fois avant de remplir la variable string. (2 heures d'essais et d'erreurs et de recherches Google), btw, utiliser chaque ligne seule ne ferait pas l'affaire.
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
C'est un problème conceptuel.
Stringstream est un flux, donc ses itérateurs sont en avant, ne peuvent pas retourner. Dans un flux de chaîne de sortie, vous avez besoin d'un flush () pour le réinitialiser, comme dans tout autre flux de sortie.
Ceux-ci ne suppriment pas les données dans le flux de chaînes dans gnu c ++
m.str("");
m.str() = "";
m.str(std::string());
Ce qui suit vide le string pour moi:
m.str().clear();