2009-04-07 9 views
5

tengo este código,¿Por qué las cadenas de caracteres rdbuf() y str() me dan una salida diferente?

int main() 
{ 
    std::string st; 
    std::stringstream ss; 
    ss<<"hej hej med dig"<<std::endl; 

    std::getline(ss,st,' '); 
    std::cout <<"ss.rdbuf()->str() : " << ss.rdbuf()->str(); 
    std::cout <<"ss.rdbuf() : " << ss.rdbuf(); 
    return 0; 
} 

mi Realizar esta salida

ss.rdbuf() -> str(): hej hej Med cavar

ss.rdbuf(): hej med dig

¿Pero por qué es eso? Es que debido a la definición de ostreams del operador < str() me da una salida diferente. En mi opinión, la salida debería ser la misma incluso si he usado getline.

Respuesta

6
ss.rdbuf()->str(); 

devoluciones copia de todo el contenido del búfer.

Qué hacer std::cout << ss.rdbuf();?

Ver descripción de

basic_ostream<charT,traits>& operator<<(basic_streambuf<charT,traits>* sb); 

Se leyó carácter por carácter de la memoria intermedia y escribir a ostream, hasta EF/error en la escritura se produce/excepción.

Ya has leído una palabra de buff. Ahora lee la parte de descanso.

+0

Oh. El hecho de que no lo he buscado en uno de mis costosos libros de C++ es que estoy de vacaciones, así que solo tengo Google y no pude encontrar un sitio que explicara el comportamiento del operador de una manera que yo entendiera. De hecho, pensé que Getline eliminó los tokens con el delim de la secuencia. – mslot

+1

No utilicé uno de los costosos libros de C++. Sino que creo que este comportamiento no se ha especificado en rbuf() y se ha comenzado a buscar en estándar para este operador de sobrecarga <<. – bayda

+1

http://ra.dkuug.dk/jtc1/sc22/open/n2356/ - Borrador estándar libre de C++ – bayda

3

Para citar de la Biblia en C++ stream I/O, Langer and Kreft, llamar a str() en un buffer de flujo (es decir, lo devuelto por rdbuf()) "se comporta de manera extremadamente contraintuitiva" (página 72 en mi edición) Para la historia completa, tendrás que leer el libro.

Si usted no recibe una respuesta satisfactoria aquí, prueba el grupo de Usenet:

http://groups.google.com/group/comp.lang.c++.moderated

+0

Oh. ¡Nunca me he dirigido a ese libro! Parece un buen libro, porque creo que me gusta la complejidad de las transmisiones en C++. – mslot

+0

Es un buen libro, si está interesado en las transmisiones. Que francamente, pocos programadores C++ (yo incluido) son. –

+0

Pero en mi ejemplo, ¿no deberían los rdbuf() y rdbuf() -> str() devolver lo mismo porque el primer parámetro de getline es una llamada por referencia? – mslot

Cuestiones relacionadas