std::stringstream и std::ios::binary
Я хочу написать std::stringstream
без каких-либо преобразований, скажем, окончания строки.
У меня есть следующий код:
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.");
}
}
}
Следующий код работает как шарм:
std::ifstream input("foo.enc", std::ios::binary);
std::ofstream output("foo.txt", std::ios::binary);
decrypt(input, output);
Если я использую следующий код, я сталкиваюсь с std::runtime_error
где вывод находится в состоянии ошибки.
std::ifstream input("foo.enc", std::ios::binary);
std::stringstream output(std::ios::binary);
decrypt(input, output);
Если я удалю std::ios::binary
функция дешифрования завершается без ошибок, но я получаю CR,CR,LF в качестве окончания строки.
Я использую VS2008 и еще не проверял код на gcc. Это так, как он должен себя вести, или реализация MS std::stringstream
сломана?
Любые идеи, как я могу получить содержимое в std::stringstream
в правильном формате? Я пытался положить содержимое в std::string
а затем с помощью write()
и это также имело тот же результат.
2 ответа
AFAIK, то binary
флаг относится только к fstream
, а также stringstream
никогда не выполняет преобразование перевода строки, так что здесь оно в большинстве случаев бесполезно.
Более того, флаги переданы stringstream
Ктор должен содержать in
, out
или оба. В твоем случае, out
необходимо (или еще лучше, используйте ostringstream
) в противном случае поток не находится в режиме вывода, поэтому запись в него не выполняется.
stringstream
Параметр ctor "mode" имеет значение по умолчанию: in|out
, который объясняет, почему все работает правильно, когда вы не передаете никаких аргументов.
Попробуй использовать
std::stringstream output(std::stringstream::out|std::stringstream::binary);