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.
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
¿Estás seguro de que no se usa binario? Del documento: http://en.cppreference.com/w/cpp/io/basic_istringstream/basic_istringstream – galinette
@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. –