Question

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

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

qui ne fonctionnent pas tous les deux.

Était-ce utile?

La solution

Pour tous les types de bibliothèques standard, la fonction membre empty() est une requête, pas une commande, c'est-à-direCela signifie "Êtes-vous vide?" Pas "Veuillez jeter votre contenu".

Le clear() la fonction membre est héritée de ios et est utilisé pour effacer l'état d'erreur du flux, par ex.si un flux de fichiers a l'état d'erreur défini sur eofbit (fin de fichier), puis en appelant clear() remettra l'état d'erreur à 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'invoquer 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 – j’opterais donc simplement pour ce qui est plus lisible.

Autres conseils

Vous pouvez effacer l'état d'erreur et vider le flux de flux en 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();

Je le vise toujours :

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

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

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

mes 2 centimes :

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 selon la demande d'un utilisateur, remplirait une variable stringstream qui fonctionnerait correctement 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 chaîne.(2 heures d'essais et d'erreurs et de recherches sur Google), d'ailleurs, 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 vont vers l'avant et ne peuvent pas revenir.Dans un flux de chaînes 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 du flux de chaînes dans GNU C++

    m.str("");
    m.str() = "";
    m.str(std::string());

Ce qui suit vide le stringstream pour moi :

    m.str().clear();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top