Maison  >  Article  >  développement back-end  >  Pourquoi la réinitialisation d'un flux de chaînes avec `str(\"\")` ne l'efface-t-elle pas ?

Pourquoi la réinitialisation d'un flux de chaînes avec `str(\"\")` ne l'efface-t-elle pas ?

DDD
DDDoriginal
2024-11-04 03:04:30932parcourir

Why Doesn't Resetting a Stringstream with `str(

Effacer un flux de chaînes

Le code suivant tente d'effacer un objet stringstream nommé parser :

<code class="cpp">stringstream parser;

parser << 5;
short top = 0;
parser >> top;
parser.str(""); // HERE I'M RESETTING parser

parser << 6; // DOESN'T PUT 6 INTO parser
short bottom = 0;
parser >> bottom;</code>

Cependant, cette approche ne fonctionne pas comme prévu. Expliquons pourquoi.

Problème :

Le problème réside dans la façon dont les flux de chaînes gèrent les indicateurs de fin de fichier (eof) et d'échec. Lorsque la première extraction (>> top) atteint la fin de la chaîne, elle définit le bit eof. Les opérations ultérieures sur le flux échouent car le bit eof reste défini.

Solution :

Pour effacer correctement un flux de chaînes, la séquence sous-jacente et les indicateurs d'échec et eof doivent être réinitialisé. Le code suivant fait ceci :

<code class="cpp">parser.str(std::string());
parser.clear();</code>

La méthode str() définit la séquence sous-jacente sur une chaîne vide, tandis que la méthode clear() efface les indicateurs fail et eof.

Avec ceux-ci change, le code lira correctement la valeur 6 dans le flux de l'analyseur et la stockera dans la variable du bas.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn