2010-02-22 26 views
5

Quiero escribir en un std::stringstream sin ninguna transformación de, digamos terminaciones de líneas.std :: stringstream y std :: ios :: binario

Tengo el siguiente código:

void decrypt(std::istream& input, std::ostream& output) 
{ 
    while (input.good()) 
    { 
     char c = input.get() 
     c ^= mask; 
     output.put(c); 

     if (output.bad()) 
     { 
      throw std::runtime_error("Output to stream failed."); 
     } 
    } 
} 

El siguiente código funciona como un encanto:

std::ifstream input("foo.enc", std::ios::binary); 
std::ofstream output("foo.txt", std::ios::binary); 
decrypt(input, output); 

Si uso un código siguiente, me encuentro con la std::runtime_error donde la producción está en el error estado.

std::ifstream input("foo.enc", std::ios::binary); 
std::stringstream output(std::ios::binary); 
decrypt(input, output); 

Si quito el std::ios::binary la función de descifrado se completa sin errores, pero termino con CR, CR, LF como los finales de línea.

Estoy usando VS2008 y aún no he probado el código en gcc. ¿Es esta la forma en que se supone que debe comportarse o la implementación de MS de std::stringstream está rota?

¿Alguna idea de cómo puedo obtener los contenidos en un std::stringstream en el formato correcto? Traté de poner los contenidos en un std::string y luego usar write() y también tuve el mismo resultado.

Respuesta

11

AFAIK, la bandera binary solo se aplica a fstream, y stringstream nunca hace la conversión de avance de línea, por lo que aquí es inútil.

Por otra parte, las banderas se pasan a Héctor stringstream 's deben contener in, out o ambos. En su caso, es necesario out (o mejor aún, use un ostringstream) de lo contrario, la transmisión no está en modo de salida, razón por la cual no se puede escribir.

stringstream El parámetro "modo" del ctor tiene un valor predeterminado de in|out, lo que explica por qué las cosas funcionan correctamente cuando no se pasa ningún argumento.

+0

El 'output.bad()' se resolvió mediante el uso de 'std :: salida stringstream (std :: :: stringstream en | std :: :: stringstream cabo | std :: stringstream :: binary); ' Y' std :: ios :: binary' no hizo nada. El error fue que otra parte del código que escribió contenido en el archivo (para la depuración) no estaba usando 'std :: ios :: binary'. – rioki

+1

¿Estás seguro de que no se usa binario? Del documento: http://en.cppreference.com/w/cpp/io/basic_istringstream/basic_istringstream – galinette

+0

@galinette: Sí, estoy bastante seguro. Nunca vi que tuviera un efecto en la práctica y el estándar especifica su efecto solo cuando se habla de flujos basados ​​en archivos. Del mismo modo, el enlace "modo binario" en la página que menciona apunta a una página sobre "archivo * de estilo C * E/S". Por supuesto, si tiene pruebas de lo contrario, compártalo para que la respuesta se pueda actualizar. –

-2

Intente utilizar

std::stringstream output(std::stringstream::out|std::stringstream::binary); 
+0

Según la documentación, puede usar 'ios_base :: in',' ios_base :: out' y 'ios_base :: ate' en C++ 11. – gomons

Cuestiones relacionadas