2010-09-21 15 views
6

Volevo sperimentare lo stringstream per un compito, ma sono un po 'confuso su come funziona. Ho fatto una rapida ricerca ma non ho trovato nulla che potesse rispondere alla mia domanda.come leggere stringstream con dimensioni dinamiche?

Dire che ho uno stream con una dimensione dinamica, come faccio a sapere quando interrompere la scrittura sulla variabile?

string var = "2 ++ asdf 3 * c"; 
stringstream ss; 

ss << var; 

while(ss){ 
    ss >> var; 
    cout << var << endl; 
} 

e la mia uscita sarebbe:

2 
++ 
asdf 
3 
* 
c 
c 

io non sono sicuro perché ho quel qualcosa in più 'c', alla fine, soprattutto perché _M_in_cur = 0x1001000d7 ""

+0

Il fatto che si tratti di uno stringstream non cambia molto di niente - lo leggi come faresti con qualsiasi altro stream. –

risposta

17

Si ottiene l'extra c alla fine perché non verificare se il flusso è ancora buono dopo aver eseguito l'estrazione:

while (ss)  // test if stream is good 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 

È necessario verificare lo stato del flusso tra quando si esegue l'estrazione e quando si utilizza il risultato. Tipicamente ciò avviene eseguendo l'estrazione nella condizione del ciclo:

while (ss >> var) // attempt extraction then test if stream is good 
{ 
    cout << var; // use result of extraction 
} 
+0

Grazie, suppongo che la mia domanda avrebbe dovuto essere formulata come controllare la condizione del flusso. –

+0

@ thomast.sang accetta la sua risposta. – gsamaras

-1

C'è anche una funzione membro buono() che verifica se il flusso può essere utilizzato per operazioni di I/O. Quindi, utilizzando questo il codice di cui sopra può essere cambiato in

while(ss.good()) // check if the stream can be used for io 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 
+1

Questo è ancora errato nel caso generale: se stai cercando di estrarre un 'int' e i successivi caratteri disponibili nel buffer non possono essere letti come un' int', l'estrazione fallirà. –

0

Il check while(ss) condizione in vostri controlli di codice Se l'ultima lettura dal flusso ha avuto successo o meno. Tuttavia, questo controllo tornerà vero anche dopo aver letto l'ultima parola nella stringa. Solo la prossima estrazione di ss >> var nel tuo codice renderà questa condizione falsa da quando è stata raggiunta la fine dello stream & non c'è nulla da estrarre nella variabile var. Questo è il motivo per cui ottieni una "c" in più alla fine. Puoi eliminarlo modificando il codice come suggerito da James McNellis.

Problemi correlati