在 C 中将 NULL 字符写入文件

Writing NULL char to file in C

我正在尝试将一个字符数组写入 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);
}

不要用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 字符串包含空终止符。)