2013-08-29 3 views
1

Я пишу программу для создания растрового изображения. Когда я тестировал его, я обнаружил, что C++ писал лишние байты (в казалось бы случайных местах), таким образом компенсируя все мои байты (впоследствии испортил изображение). Я пишу в файл из массива. Я исчерпываю полное содержимое массива, и они идеальны, однако дополнительные байты всегда записываются. Это было исправлено, открыв файл с помощью ios :: двоичного флага.Ofstream :: write пишет дополнительные байты, несмотря на явный исходный массив

Зачем нужно открывать файл с и без значка ios :: двоичного флага, если я выводю из одного и того же массива.

Использование Code :: Blocks 12.11, компилятор по умолчанию с C++ 0x

+0

Вы просматривали * байты * содержимого массива? Например, ваш text-outut-stream может хорошо преобразовать CR в CR/LF. Мой вопрос: «Почему я должен пытаться записать двоичные данные в поток вывода текста и ожидать, что он будет работать * – WhozCraig

+0

Ответ, предоставленный Inspired, соответствует моему сценарию отлично .. и я смотрю на отдельные байты (сделал свой собственный буфер), поскольку они идут в поток. – ithenoob

+0

Отлично. Это не необычная икота. Рад, что вы нашли ответ. – WhozCraig

ответ

4

Потому что вы, скорее всего, с помощью Windows, и есть некоторые соглашения о том, как некоторые специальные символы (например, новой строки) представлены в текст файлы: напр. \n в Windows преобразуется в \r\n, а чтение 0x1E («EOF») повышает флаг конца файла. Эти преобразования не возникают, если вы открываете файл в двоичном (нетекстовом) режиме.

И даже если вы не используете Windows: всегда используйте двоичный режим для двоичных данных, это переносимый способ.