Comment effacer une variable stringstream?
j'ai déjà essayé plusieurs choses,
std::stringstream m;
m.empty();
m.clear();
deux qui ne marchent pas.
8 réponses
pour tous les types de bibliothèques standards, la fonction de membre empty()
est une requête, Pas une commande, c'est-à-dire qu'elle signifie "Êtes-vous vide?"non ", veuillez jeter votre contenu".
la fonction de membre clear()
est héritée de ios
et est utilisée pour effacer l'état d'erreur du flux, par exemple si un flux de fichier a l'état d'erreur défini à eofbit
(end-of-file), alors appeler clear()
ramènera l'état d'erreur à goodbit
(aucune erreur).
pour vider le contenu d'un stringstream
, en utilisant:
m.str("");
est correct, mais en utilisant:
m.str(std::string());
est techniquement plus efficace, car vous évitez d'invoquer le constructeur std::string
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 - donc je dirais juste ce qui est le plus lisible.
vous pouvez effacer l'état d'erreur et vider le strignstream tout en une seule ligne
std::stringstream().swap(m); // swap m with a default constructed stringstream
cela rétablit effectivement m dans un état construit par défaut
ceci devrait être le moyen le plus fiable quel que soit le compilateur:
m=std::stringstream();
je suis toujours à la portée:
{
std::stringstream ss;
ss << "what";
}
{
std::stringstream ss;
ss << "the";
}
{
std::stringstream ss;
ss << "heck";
}
mes 2 cents:
cela a semblé fonctionner pour moi dans xcode et dev-c++, j'ai eu un programme sous la forme d'un menu qui si exécuté itérativement selon la demande d'un utilisateur remplira une variable stringstream qui fonctionnerait bien la première fois le code serait exécuté mais ne dégagerait pas le stringstream la prochaine fois l'utilisateur exécutera le même code. mais les deux lignes de code ci-dessous ont finalement clarifié la variable stringstream à chaque fois avant de remplir la variable string. (2 heures d'essais et d'erreurs et recherches google), btw, en utilisant chaque ligne sur leur propre 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 avancés, ne peuvent pas revenir. Dans un stringstream 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 stringstream de gnu C++
m.str("");
m.str() = "";
m.str(std::string());
ce qui suit vide le stringstream pour moi:
m.str().clear();