1

我正在尝试将字符数组写入 C 中的 BMP 文件。问题在于,虽然文件需要 0x00 值,但似乎 C 在写入文件时将其解释为字符串的结尾,即作为 NULL字符。有什么办法可以覆盖它并让 C 完全依赖我所说的我希望通过的字符数?

将标头写入文件的代码(此函数在 main 中执行);

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);
}
4

2 回答 2

8

不要fprintf()用来写二进制数据,当然会把它的格式化字符串解释为字符串。这就是它的作用!

使用fwrite(), 并使用 . 以二进制模式打开文件"wb"

您可以sizeof用来计算数组的大小,无需对值进行硬编码:

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

这是有效的,因为它与bmp1.

于 2015-04-23T12:46:13.397 回答
2

该函数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 字符串包含空终止字符。)

于 2015-04-23T12:51:00.563 回答