【问题标题】:create a binary file in C在 C 中创建一个二进制文件
【发布时间】:2023-08-27 19:12:01
【问题描述】:

我目前正在创建二进制文件。这是我尝试过的。

示例 1:

#include<stdio.h>

int main() {
    /* Create the file */
    int a = 5;
    FILE *fp = fopen ("file.bin", "wb");
    if (fp == NULL)
      return -1;
    fwrite (&a, sizeof (a), 1, fp);
    fclose (fp);
    }

    return 0;
}

示例 2:

#include <stdio.h>
#include <string.h>

int main()
{
    FILE *fp;
    char str[256] = {'\0'};
    strcpy(str, "3aae71a74243fb7a2bb9b594c9ea3ab4");
    fp = fopen("file.bin", "wb");
    if(fp == NULL)
        return -1;
    fwrite(str, sizeof str, 1, fp);
    return 0;
}

示例 1 以二进制形式给出正确的输出。但是我传递字符串的示例 2 并没有给我正确的输出。它将我提供的输入字符串写入文件并附加一些数据(二进制形式)。

我不明白,我无法弄清楚我在做什么。

【问题讨论】:

  • 在 fwrite() 调用中,您应该使用 strlen(str),而不是“sizeof str”。另外,例如“hexdump file.bin”中的文件内容是什么样的?
  • 示例 2 做的是正确的事情。您写出了 ASCII 值,它们是字符的二进制表示。因此,如果您检查文件,您当然会看到该字符串。在那之后,由于你写了 256 个字节,你还将得到内存中那些字符之外的任何 gobblety gook,但你的字符串比这短。
  • 别忘了关闭文件fclose(fp);
  • 对像 strcpystrlen 这样的空终止字符串使用函数对于二进制数据来说似乎是个坏主意。

标签: c file fwrite


【解决方案1】:

问题是sizeof str是256,也就是本地声明的字符数组的整个大小。但是,您存储在其中的数据不需要全部 256 个字符。结果是写入操作写入了字符串的所有字符以及字符数组中已经发生的任何垃圾。尝试以下行作为修复:

fwrite(str, strlen(str), 1, fp);

【讨论】:

    【解决方案2】:

    C 字符串以 null 结尾,这意味着必须忽略 '\0' 字符之后的任何内容。如果您将示例 2 写入的文件读入 str[256] 并使用 printf("%s", str) 将其打印出来,您将得到没有额外字符的原始字符串,因为空终止符也会被读入缓冲区,从而提供正确的终止对于字符串。

    您在输出中获得额外“垃圾”的原因是 fwrite 不会将 str[] 数组解释为 C 字符串。它将其解释为大小为 256 的缓冲区。文本编辑器不会将空字符解释为终止符,因此来自 str 的随机字符会被写入文件。

    如果您希望写入文件的字符串以最后一个有效字符结束,请在调用fwrite 时使用strlen(str) 作为大小。

    【讨论】:

      最近更新 更多