Запись 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 содержат нулевой завершающий символ.)