Domanda

Ho già provato diverse cose,

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

entrambi non funzionano.

È stato utile?

Soluzione

Per tutti i tipi di libreria standard la funzione membro empty() è una query, non un comando, ad es.Significa "Sei vuoto?" Non "per favore buttare via il tuo contenuto".

IL clear() la funzione membro è ereditata da ios e viene utilizzato per cancellare lo stato di errore del flusso, ad es.se un flusso di file ha lo stato di errore impostato su eofbit (fine del file), quindi chiamando clear() ripristinerà lo stato di errore goodbit (nessun errore).

Per cancellare il contenuto di a stringstream, utilizzando:

m.str("");

è corretto, anche se si utilizza:

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

è tecnicamente più efficiente, perché eviti di invocare il std::string costruttore che prende const char*.Ma qualsiasi compilatore al giorno d'oggi dovrebbe essere in grado di generare lo stesso codice in entrambi i casi, quindi preferirei semplicemente ciò che è più leggibile.

Altri suggerimenti

È possibile cancellare lo stato di errore e svuotare lo strignstream in un'unica riga

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

Ciò ripristina effettivamente m a uno stato costruito predefinito

m.str("");

sembra funzionare.

Questo dovrebbe essere il modo più affidabile indipendentemente dal compilatore:

m=std::stringstream();

Lo osservo sempre:

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

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

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

i miei 2 centesimi:

questo sembrava funzionare per me in xcode e dev-c++, avevo un programma sotto forma di menu che, se eseguito in modo iterativo secondo la richiesta di un utente, riempiva una variabile stringstream che avrebbe funzionato bene la prima volta che il codice avrebbe funzionato eseguito ma non cancellerebbe lo stringstream la prossima volta che l'utente eseguirà lo stesso codice.ma le due righe di codice seguenti hanno finalmente cancellato la variabile stringstream ogni volta prima di riempire la variabile stringa.(2 ore di tentativi ed errori e ricerche su Google), tra l'altro, utilizzare ciascuna riga da sola non risolverebbe il problema.

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";

È un problema concettuale.

Stringstream è un flusso, quindi i suoi iteratori sono avanti e non possono restituire.In uno stringstream di output, è necessario un flush() per reinizializzarlo, come in qualsiasi altro flusso di output.

Questi non eliminano i dati nello stringstream in gnu c++

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

Quanto segue svuota lo stringstream per me:

    m.str().clear();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top