Comment effacer une variable stringstream?

j'ai déjà essayé plusieurs choses,

std::stringstream m;
m.empty();
m.clear();

deux qui ne marchent pas.

414
demandé sur BartoszKP 2008-08-21 22:35:57

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.

657
répondu Wilka 2015-09-03 20:31:11

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

38
répondu Nikos Athanasiou 2014-05-18 09:50:29
m.str("");

semble fonctionner.

33
répondu CodingWithoutComments 2008-08-21 18:36:18

ceci devrait être le moyen le plus fiable quel que soit le compilateur:

m=std::stringstream();
31
répondu jerron 2012-10-29 17:15:18

je suis toujours à la portée:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}
12
répondu TimoK 2018-06-05 08:23:58

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";
8
répondu Francisco Cortes 2018-06-26 13:07:00

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.

0
répondu Alcino Dall Igna Junior 2014-10-10 20:04:50

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();
-7
répondu John 2012-09-06 22:58:41