Come si cancella una variabile stringstream?

Ho già provato diverse cose,

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

entrambi i quali non funzionano.

Per tutti i tipi di libreria standard la funzione membro empty() è una query, non un comando, cioè significa “sei vuoto?” non “per favore butta via i tuoi contenuti”.

La funzione membro clear() è ereditata da ios e viene utilizzata per cancellare lo stato di errore del stream, ad esempio se un stream di file ha lo stato di errore impostato su eofbit (fine del file), quindi chiamando clear() imposterà il stato di errore torna a goodbit (nessun errore).

Per cancellare il contenuto di un stringstream , usando:

 m.str(""); 

è corretto, sebbene usi:

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

è tecnicamente più efficiente, perché eviti di invocare il costruttore std::string che prende const char* . Ma ogni compilatore in questi giorni dovrebbe essere in grado di generare lo stesso codice in entrambi i casi – quindi vorrei solo andare con quello che è più leggibile.

È ansible 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ò resetta efficacemente m allo stato predefinito costruito

 m.str(""); 

sembra funzionare.

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

 m=std::stringstream(); 

Lo cerco 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 un menu che se eseguito in modo iterativo secondo la richiesta di un utente riempie una variabile stringstream che funzionerebbe bene la prima volta che il codice eseguire ma non cancellerebbe lo stringstream la volta successiva che l’utente eseguirà lo stesso codice. ma le due righe di codice seguenti chiarivano definitivamente la variabile stringstream ogni volta prima di riempire la variabile stringa. (2 ore di tentativi ed errori e ricerche su google), btw, usare ciascuna linea da sola non avrebbe funzionato.

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

È un problema concettuale.

Stringstream è un stream, quindi i suoi iteratori sono in avanti, non possono tornare. In un stringstream di output, è necessario un flush () per reinizializzarlo, come in qualsiasi altro stream 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();