Ho già provato diverse cose,
std::stringstream m;
m.empty();
m.clear();
entrambi non funzionano.
Ho già provato diverse cose,
std::stringstream m;
m.empty();
m.clear();
entrambi non funzionano.
Risposte:
Per tutti i tipi di libreria standard la funzione membro empty()
è una query, non un comando, ovvero significa "sei vuoto?" non "per favore getta via i tuoi contenuti".
La clear()
funzione membro viene ereditata da ios
e viene utilizzata per cancellare lo stato di errore del flusso, ad esempio se un flusso di file ha lo stato di errore impostato su eofbit
(fine file), la chiamata clear()
ripristinerà lo stato di errore su goodbit
(nessun errore) .
Per cancellare il contenuto di a stringstream
, usando:
m.str("");
è corretto, sebbene l'utilizzo di:
m.str(std::string());
è tecnicamente più efficiente, perché eviti di invocare il std::string
costruttore che richiede const char*
. Ma qualsiasi compilatore in questi giorni dovrebbe essere in grado di generare lo stesso codice in entrambi i casi, quindi vorrei andare con tutto ciò che è più leggibile.
È possibile cancellare lo stato di errore e svuotare il flusso di stringhe tutto in una riga
std::stringstream().swap(m); // swap m with a default constructed stringstream
Ciò reimposta efficacemente m su uno stato predefinito costruito
m.str("");
sembra funzionare.
Questo dovrebbe essere il modo più affidabile indipendentemente dal compilatore:
m=std::stringstream();
mm.clear(); mm.str("");
fatto il trucco. (nessun C ++ 11, altrimenti lo scambio sarebbe meglio).
swap
meglio dell'assegnazione di traslochi?
i miei 2 centesimi:
questo sembrava funzionare per me in xcode e dev-c ++, avevo un programma sotto forma di un menu che se eseguito in modo iterativo secondo la richiesta di un utente riempirebbe una variabile stringstream che funzionerebbe bene la prima volta che il codice sarebbe eseguito ma non cancella lo stringstream la prossima volta che l'utente eseguirà lo stesso codice. ma le due righe di codice sottostanti hanno finalmente chiarito ogni volta la variabile stringstream prima di riempire la variabile stringa. (2 ore di prove ed errori e ricerche su Google), tra l'altro, usare ciascuna riga per conto proprio non farebbe il trucco.
//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 in avanti, non possono tornare. In uno stringstream di output, è necessario un flush () per reinizializzarlo, come in qualsiasi altro flusso di output.
Questi non scartano 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();