在C中创建一个二进制文件

时间:2015-06-12 18:37:21

标签: c file fwrite

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

示例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并没有给我正确的输出。它将我给出的输入字符串写入文件并附加一些数据(二进制形式)。

我不明白,而且我无法弄清楚我在做什么错误。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

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