2012-09-18 20 views
8

Estoy tratando de modificar un stringbuffer de un objeto stringstream sin tener que copiar una cadena, usando el método pubsetbuf, pero no está funcionando. Estoy siguiendo la documentación en http://www.cplusplus.com/reference/iostream/streambuf/pubsetbuf/. Aquí está mi código de ejemplo:stringstream-> rdbuf() -> pubsetbuf no está configurando el buffer

#include <iostream> 
#include <sstream> 

int main(int argc, char* argv[]) 
{ 
    std::stringstream stream("You say goodbye"); 
    char replace[] = {"And I say hello"}; 
    std::cout << stream.str() << std::endl; // Checking original contents 
    stream.rdbuf()->pubsetbuf(replace, 16); // Should set contents here 
    std::cout << stream.str() << std::endl; // But don't :(
    return 0; 
} 

Y la salida es:

You say goodbye 
You say goodbye 

Sé que puedo utilizar stream.str (sustituir), pero este método copia el valor de 'reemplazar', y yo no quiero hacer una copia

¿Qué me estoy perdiendo?

Actualización: estoy usando VS2010

+1

simplemente una búsqueda ridículamente rápido de SO - estás experimentando este problema? http://stackoverflow.com/questions/1494182/setting-the-internal-buffer-used-by-a-standard-stream-pubsetbuf –

+0

Si usa VS, eche un vistazo a [esta pregunta] (http://stackoverflow.com/q/10054396/416627) (y respuesta). No funciona como crees. Su implementación está definida y solo se implementa donde tiene sentido. –

+0

Posible duplicado de [Configuración del búfer interno utilizado por una secuencia estándar (pubsetbuf)] (http://stackoverflow.com/questions/1494182/setting-the-internal-buffer-used-by-a-standard-stream-pubsetbuf) –

Respuesta

10

no debe establecer contenidos. pubsetbuf llamadas virtual setbuf

basic_streambuf<charT,traits>* setbuf(charT* s, streamsize n); 

15: Efectos definido aplicación, excepto que setbuf (0,0) no tiene efecto.

16 Devoluciones: esto.

VS 2010. No hay sobrecarga del método virtual en setbufbasic_stringbuf, que utiliza por defecto desde basic_streambuf

virtual _Myt *__CLR_OR_THIS_CALL setbuf(_Elem *, streamsize) 
    { // offer buffer to external agent (do nothing) 
    return (this); 
    } 
+0

Gracias. Pensé que las "implementaciones específicas" en la documentación se referían a las clases concretas, no a la implementación específica del proveedor. Supuse que funcionaría bien en cualquier compilador de C++. –

Cuestiones relacionadas