2012-01-11 20 views
14

Cuando coloco algo en un stringstream, digamos un número real, si luego inserto ese objeto stringstream en cout ... ¿qué estoy mirando?cout << stringstream

Normalmente recibo un número extraño. ¿Es esta una ubicación de memoria? Sólo curioso.

Parece que el comentario más abajo dispara, pero esto es lo que estoy tratando de hacer:

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

Básicamente yo sólo estaba tratando de ver lo que parecía holdBuff vez me inserta stringIn. Estoy tratando de que el usuario introduzca una cadena y luego quiero al paso a través de él en busca de contenidos de TI y convertir possilbly ...

Respuesta

19

¿Qué le parece

holdBuff << getline(cin, stringIn); 

está haciendo. El tipo de devolución de getline es una referencia a la secuencia que se lee (cin) en este caso. Como no hay << definida que toma un std::istream como segundo argumento, el compilador intenta diferentes conversiones: en C++ 11, std::istream tiene una conversión implícita a bool, y en el anterior C++, una conversión implícita a std::ios* o algo similar (pero el único uso válido del valor devuelto es convertirlo a bool). Por lo tanto, obtendrá 1 (C++ 11) o alguna dirección aleatoria (en la práctica, generalmente la dirección de la transmisión, pero este no está garantizado).Si desea obtener los resultados de una llamada a getline en un std::ostringstream, necesita dos operaciones (con un cheque de errores entre ellos):

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

Del mismo modo, para escribir el contenido de un std::ostringstream,

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

es la solución correcta. Si usted insiste en el uso de un std::stringstream cuando un std::ostringstream sería más apropiado, también se puede hacer:

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

La primera solución es preferible, sin embargo, ya que es mucho más idiomática.

En cualquier caso, una vez más, no hay << operador que toma cualquier iostream tipo, por lo que terminan con los resultados de la conversión implícita a bool o un puntero.

+0

Muchas gracias James. Buena información Tendré que buscar la diferencia entre ostringstream y stringstream. ¿Es esa la buena/forma de nivel de entrada para tirar de una línea de tipos posiblemente mixtos? Gracias. – MCP

2
cout << s.rdbuf(); 

es lo que desea. Alternativamente, es posible que desee

count << s.str(); 

que pueden ser más caros en términos de recursos.

13

Sí, es probable que vea la dirección de la secuencia de cadenas.

Si desea mostrar la cadena que contiene, tratar

cout << stream.str(); 
+0

esto crea una copia del búfer ya que str() regresa por valor. –

5

Sí, es más probable una posición de memoria de una forma u otra. Lo más probable es que sea el puntero al propio objeto de cadena de caracteres.

Se podría confirmar esto de la siguiente manera:

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

Dicho esto cuando se quiere cout un stringstream se debe utilizar la función str() de la siguiente manera:

cout << ss.str(); 
Cuestiones relacionadas