Запись NULL char в файл на C

Я пытаюсь записать массив char в файл BMP на C. Проблема в том, что, хотя для файла требуются значения 0x00, кажется, что C интерпретирует это как конец строки при записи в файл, то есть как NULL. голец. Есть ли способ, которым я могу переопределить это и сделать так, чтобы C полагался исключительно на то, что я говорю - это число символа, которое я хочу передать?

Код для записи заголовка в файл (эта функция выполняется в основном);

void writeFile(void){
    unsigned char bmp1[54] = {
    0x42, 0x4D, 0x36, 0x00, 
    0x0C, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x36, 0x00, 
    0x00, 0x00, 0x28, 0x00, 
    0x00, 0x00, 0x00, 0x02, 
    0x00, 0x00, 0x00, 0x02, 
    0x00, 0x00, 0x01, 0x00, 
    0x18, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 
    0x0C, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00
    };

    FILE *picFile = fopen("pic.bmp","w");
    fprintf(picFile, bmp1, 54);
    fclose(picFile);
}

2 ответа

Решение

Не использовать fprintf() для записи двоичных данных, конечно, он будет интерпретировать свою строку форматирования как строку. Вот что это делает!

использование fwrite() и откройте ваш файл в двоичном режиме с помощью "wb",

Ты можешь использовать sizeof чтобы вычислить размер массива, не нужно жестко кодировать значение:

FILE *picFile = fopen("pic.bmp", "wb");
if(picFile != NULL)
  fwrite(bmp1, sizeof bmp1, 1, picFile);
fclose(picFile);

Это работает, потому что находится в той же области, что и объявление массива bmp1,

Функция fprintf() и его родственники используются для форматирования некоторой информации и создания строки, затем записывают ее символы 1 в файл или выводят на экран или сохраняют в заданном массиве символов.

Использовать функцию fwrite() записывать двоичные данные; эта функция никак не интерпретирует данные, которые вы ей предоставляете, а просто записывает количество байтов, которые вы указали в файл.

Попробуй это:

FILE *picFile = fopen("pic.bmp","w");
fwrite(bmp1, sizeof(bmp1), 1, picFile);
fclose(picFile);

(ваш звонок fprintf() все равно был ошибочным)


1 Функции sprintf() а также snprintf() (они помещают сгенерированную строку в предоставленный буфер символов) копируют всю сгенерированную строку в свой целевой буфер, включая нулевой завершающий символ.
Функции fprintf() (записывает строку в файл) и printf() (выводит строку на экран) не помещайте нулевой завершающий символ сгенерированной строки в выходной поток.

(Спасибо @chux за указание на то, что строки C содержат нулевой завершающий символ.)

Другие вопросы по тегам