2010-02-22 3 views
5

Я хочу написать без каких-либо преобразований, например строк.std :: stringstream и std :: ios :: binary

У меня есть следующий код:

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(), и он также имел тот же результат.

ответ

11

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

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

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

+0

В 'output.bad()' была решена с помощью 'зЬй :: выход stringstream (станд :: stringstream :: в | станд :: stringstream :: из | std :: stringstream :: binary); ' И' std :: ios :: binary' ничего не делал. Ошибка заключалась в том, что другой фрагмент кода, который писал содержимое в файл (для отладки), не использовал 'std :: ios :: binary'. – rioki

+1

Вы уверены, что двоичный файл не используется? Из документа: http://en.cppreference.com/w/cpp/io/basic_istringstream/basic_istringstream – galinette

+0

@galinette: Да, я уверен. Я никогда не видел, чтобы это имело эффект на практике, и стандарт определяет его эффект только при разговоре о потоках, основанных на файлах. Аналогично, ссылка «двоичный режим» на упомянутой странице указывает на страницу о «C-style * file * I/O». Конечно, если у вас есть доказательства обратного, сообщите об этом, чтобы ответ можно было обновить. –

-2

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

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

В соответствии с документацией вы можете использовать 'ios_base :: in',' ios_base :: out' и 'ios_base :: ate' в C++ 11. – gomons

Смежные вопросы