Come si cancella una variabile stringstream?


Risposte:


771

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 iose 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::stringcostruttore 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.


105
Ecco cosa succede quando si dimentica la parte "clear ()". stackoverflow.com/q/2848087/635549
galath

8
@KshitijBanerjee Penso che in C ++ m.str () e m.str ("") siano due funzioni diverse. m.str () invoca una funzione che non si aspettava alcun parametro mentre m.str ("") invocherà la funzione che accetta un parametro const char *. m.str () potrebbe essere stato implementato come una funzione get che restituisce la stringa mentre m.str ("") potrebbe essere stato implementato come una funzione set .
Dinesh PR,

4
Come ha detto Galath, è molto importante aggiungere anche m.clear (); oltre a m.str ("") ;. Altrimenti puoi avere problemi se a un certo punto riempi lo stringstream con una stringa vuota.
Sputnik,

1
@anthropod Sì, quello era l'anno scorso. Da allora l'ho fatto funzionare.
James,

1
Oh ragazzo è così intuitivo. Proprio come tutto il resto su C ++!
luna piena di sole

47

È 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


3
Questo è il modo più efficiente ed elegante per farlo rispetto a tutte le altre risposte qui. Tuttavia, std :: stringstream :: swap è una funzione c ++ 11 e questa soluzione non funziona con i precedenti compilatori c ++ 11.
101010,

4
Caratteristica ancora manca in GNU g ++ v4.8, vedere stackoverflow.com/questions/24429441/...
Joachim W

7
@ 101010: In che modo lo scambio è meglio dell'assegnazione di traslochi?
Deduplicatore

2
@AsetD: Anche se non è escluso, hai dimenticato il temporaneo predefinito?
Deduplicatore

3
Questo è poco efficace. Quando voglio riutilizzare gli originali ss. Si scambia un vuoto per me.
Zhang,


33

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

m=std::stringstream();

2
Questo è meglio secondo me perché m.str (""); fatto in modo che il mio flusso di stringhe rimanga bloccato con quel valore vuoto qualunque cosa abbia provato. Ma usando questo non ho questo problema
gelatine1

3
Mi sono imbattuto nello stesso problema, per me ha mm.clear(); mm.str("");fatto il trucco. (nessun C ++ 11, altrimenti lo scambio sarebbe meglio).
Hochl,

1
@hochl: Perché sarebbe swapmeglio dell'assegnazione di traslochi?
Deduplicatore,

4
Non va bene per tutte le situazioni. Ciò riassegnerebbe il buffer ogni volta, mentre mm.str ("") non lo farebbe.
Shital Shah,

3
Il mio caso d'uso principale per lo svuotamento di un oggetto stringstream consiste nel mantenere un oggetto stringstream threadlocal per impedire un'istanza non necessaria dello stringstream - l'istanza di un nuovo oggetto stringstream copia l'oggetto locale globale - teoricamente questo è rapido e comporta solo l'incremento di un atomico, ma a livello di concorrenza di cui mi occupo è spesso paralizzante.
Spaziale

12

Lo cerco sempre:

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

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

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

1
È meglio che cancellare ilstringstream?
Robur_131

11

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";


-12

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();

7
Non sono così sicuro che funzionerebbe, per gli stessi motivi per cui Bernhardrusch non avrebbe funzionato. La funzione .str () restituisce una copia e cancellare la copia non farebbe nulla.
Verdagon,

1
Questa soluzione NON funziona per Microsoft Visual C ++.
Zak,

Non corretto. Clear funzionerebbe sulla stringa restituita dal flusso, non dal flusso stesso.
Joey Carson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.