Hoe wis je een stringstream-variabele?

Ik heb al verschillende dingen geprobeerd,

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

die beide niet werken.


Antwoord 1, autoriteit 100%

Voor alle standaard bibliotheektypen is de lidfunctie empty()een query, geen opdracht, d.w.z. het betekent “ben je leeg?” niet “gooi uw inhoud weg”.

De clear()lidfunctie is overgenomen van iosen wordt gebruikt om de foutstatus van de stream te wissen, b.v. als een bestandsstroom de foutstatus heeft ingesteld op eofbit(end-of-file), dan zal het aanroepen van clear()de foutstatus terugzetten naar goodbit(geen fout).

Voor het wissen van de inhoud van een stringstream, gebruik je:

m.str("");

is correct, maar gebruik:

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

is technisch efficiënter, omdat je het aanroepen van de std::stringconstructor die const char*nodig heeft, vermijdt. Maar tegenwoordig zou elke compiler in beide gevallen dezelfde code moeten kunnen genereren – dus ik zou gewoon gaan met wat beter leesbaar is.


Antwoord 2, autoriteit 7%

U kunt de foutstatus wissen en de stringstream op één regel leegmaken

std::stringstream().swap(m); // swap m with a default constructed stringstream

Dit zet m effectief terug naar een standaard geconstrueerde staat


Antwoord 3, autoriteit 4%

m.str("");

lijkt te werken.


Antwoord 4, autoriteit 4%

Dit zou de meest betrouwbare manier moeten zijn, ongeacht de compiler:

m=std::stringstream();

Antwoord 5

Ik zoek het altijd af:

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

Antwoord 6

mijn 2 cent:

dit leek voor mij te werken in xcode en dev-c++, ik had een programma in de vorm van een menu dat, indien iteratief uitgevoerd volgens het verzoek van een gebruiker, een stringstream-variabele zal vullen die de eerste keer goed zou werken de code zou worden uitgevoerd, maar zou de stringstream niet wissen de volgende keer dat de gebruiker dezelfde code uitvoert. maar de twee onderstaande regels code hebben uiteindelijk de stringstream-variabele elke keer opgeruimd voordat de string-variabele wordt gevuld. (2 uur vallen en opstaan en Google-zoekopdrachten), trouwens, het zou niet werken om elke regel afzonderlijk te gebruiken.

//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";

Antwoord 7

Het is een conceptueel probleem.

Stringstream is een stream, dus de iterators zijn voorwaarts en kunnen niet terugkeren. In een output stringstream heb je een flush() nodig om deze opnieuw te initialiseren, zoals in elke andere outputstream.


Antwoord 8

Deze negeren de gegevens in de stringstream in gnu c++ niet

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

Het volgende maakt de stringstream voor mij leeg:

   m.str().clear();

Other episodes