Почему метод C ++ ofstream write () изменяет мои необработанные данные? - PullRequest
6 голосов
/ 29 августа 2009

У меня есть изображение jpeg в буфере char [] в памяти, все, что мне нужно сделать, это записать его на диск в том виде, как он есть. Прямо сейчас я делаю это

ofstream ofs;
ofs.open(filename);
ofs.write(buffer, bufferLen);
ofs.close();

но изображение получилось неправильным, оно везде искажено случайными черно-белыми полосами. После сравнения изображения с оригиналом в программе просмотра в шестнадцатеричном формате, я обнаружил, что ofstream изменяет данные, когда думает, что я пишу символ новой строки. В любом месте, где 0x0A отображается в оригинале, ofstream записывает в виде двух байтов: 0x0D0A. Я должен предположить, что ofstream намеревается конвертировать из LF только в CRLF, есть ли стандартный способ заставить его этого не делать?

Ответы [ 5 ]

9 голосов
/ 29 августа 2009

Вы должны установить режим файла на binary, когда вы открываете это:

std::ofstream file;
file.open("filename.jpg", std::ios_base::out | std::ios_base::binary);

Таким образом, поток не пытается настроить переводы строк в ваш собственный текстовый формат.

9 голосов
/ 29 августа 2009

Установить двоичный режим при открытии файла:

http://www.cplusplus.com/reference/iostream/ofstream/ofstream/

5 голосов
/ 29 августа 2009

Попробуйте открыть ofstream как двоичный файл. Примерно так должно работать:

ofstream ofs;
ofs.open(filename, ios::out | ios::binary);
ofs.write(buffer, bufferLen);
ofs.close();
1 голос
/ 29 августа 2009

Поскольку вы не открываете файл в двоичном режиме, по умолчанию он настроен на форматированный вывод. В форматированном выводе ваша реализация выполняет преобразование символов конца строки, как вы описываете.

0 голосов
/ 13 мая 2014

Хотелось бы, чтобы моя версия могла написать что-нибудь вообще ... без ошибок, без жалоб, без ошибок, когда вы отлаживаете, но он даже не пытается создать файл. Что, черт возьми, не так с fopen, fwrite и fclose ... У меня никогда не было проблем с ними

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...