2012-01-11 6 views
14

Quando metto qualcosa in uno stringstream, diciamo un numero reale, se poi inserisco quell'oggetto stringstream in cout ... cosa sto guardando?cout << stringstream

Generalmente ricevo un numero strano. Questa è una posizione di memoria? Solo curioso.

Sembra che il commento qui sotto colpito ma qui è quello che sto cercando di fare:

string stringIn; 
stringstream holdBuff; 
holdBuff << getline(cin, stringIn); 
cout << holdBuff; 

Fondamentalmente stavo solo cercando di vedere cosa holdBuff sembrava una volta ho inserito Stringin. Sto cercando di avere all'utente di inserire una stringa e poi voglio fare un passo attraverso di essa alla ricerca di suo contenuto e possilbly conversione ...

risposta

19

Cosa pensi

holdBuff << getline(cin, stringIn); 

sta facendo. Il tipo restituito di getline è un riferimento allo streaming in lettura (cin) in questo caso. Dal momento che non c'è definito << che prende un std::istream come secondo argomento, il compilatore cerca diversi conversioni: in C++ 11, std::istream ha una conversione implicita per bool, e in precedenza C++, una conversione implicita a std::ios*, o qualcosa simile (ma l'unico uso valido del valore restituito è convertirlo in bool). Quindi fornirai l'output 1 (C++ 11) o l'indirizzo casuale (in pratica, di solito l'indirizzo dello stream, ma questo non è garantito).Se si desidera ottenere i risultati di una chiamata a getline in un std::ostringstream, avete bisogno di due operazioni (con un assegno per errori tra di loro):

if (!getline(std::cin, stringIn)) 
    // Error handling here... 
holdBuff << stringIn; 

Allo stesso modo, a scrivere il contenuto di un std::ostringstream,

std::cout << holdBuf.str() ; 

è la soluzione corretta. Se ti ostini a usare un std::stringstream quando un std::ostringstream sarebbe più appropriato, si può anche fare:

std::cout << holdBuf.rdbuf(); 

La prima soluzione è preferibile, tuttavia, come è molto più idiomatica.

In ogni caso, una volta, non c'è << operatore che prende qualsiasi tipo iostream, così si finisce con i risultati della conversione implicita a bool o un puntatore.

+0

Grazie mille James. Grandi informazioni Dovrò cercare la differenza tra stringstream e stringstream. E 'questo il modo migliore per entrare in una linea di tipi possibilmente misti? Grazie. – MCP

2
cout << s.rdbuf(); 

è quello che volete. In alternativa si consiglia di

count << s.str(); 

che può essere più costoso in termini di risorse però.

13

Sì, è probabile che si veda l'indirizzo dello stringstream.

Se si desidera visualizzare la stringa che contiene, provare

cout << stream.str(); 
+0

crea una copia del buffer poiché str() restituisce per valore. –

5

Sì, è più probabile che una locazione di memoria di una forma o nell'altra. Molto probabilmente è il puntatore all'oggetto stesso dello stringing.

Si potrebbe confermarlo come segue:

std::stringstream ss; 
unsigned long long ll = (unsigned long long)&ss; 
cout << ll; 

Detto questo quando si vuole cout uno stringstream si dovrebbe usare la funzione str() come segue:

cout << ss.str();