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);
Другие вопросы по тегам