std :: stringstream и std :: ios :: binary - PullRequest
       24

std :: stringstream и std :: ios :: binary

6 голосов
/ 22 февраля 2010

Я хочу записать в 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 ]

12 голосов
/ 22 февраля 2010

AFAIK, флаг binary применяется только к fstream, а stringstream никогда не выполняет преобразование перевода строки, поэтому здесь оно в большинстве случаев бесполезно.

Кроме того, флаги, передаваемые в ctor stringstream, должны содержать in, out или оба. В вашем случае out необходимо (или, что еще лучше, используйте ostringstream), иначе поток не находится в режиме вывода, поэтому запись в него не удалась.

stringstream Параметр "mode" ctor имеет значение по умолчанию in|out, которое объясняет, почему все работает правильно, если вы не передаете аргумент.

0 голосов
/ 22 февраля 2010

Попробуйте использовать

std::stringstream output(std::stringstream::out|std::stringstream::binary);
...