如何在C语言中将数据写入二进制文件

3
我尝试向二进制文件写入数据时遇到了问题。以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct
{
char name[255];
int quantity;
float price;
} product;

int main()
{
product x;
FILE *f;
strcpy(x.name,"test");
x.quantity=10;
x.price=20.0;
f=fopen("test.txt","wb");
fwrite(&x,sizeof(x),1,f);
fclose(f);
return 0;
}

当我运行程序时,它只写入x.name字符串,而忽略了其他两个(quantity和price)。 我已经在谷歌上搜索过,这似乎是将数据写入二进制文件的正确函数...但对我来说仍然无效。 我该怎么办?提前致谢!

1
https://dev59.com/wHRC5IYBdhLWcg3wOeSB - vmg
2个回答

3
你的函数完全没有问题,问题在于你写入了大量未使用的数据,并且没有使用正确的工具查看二进制文件。你将"test"放入名称中,该名称的大小为255个字符。这耗费了前五个字符(四个字母加上空终止符),而其余250个字符未被使用。它们被写入文件中,成为"垃圾填充",位于"test"和其他数据之间。如果你编写一个简单的程序来读取文件,你会发现数量和价格都已经正确地设置为你写入的值:
int main()
{
    product x;
    FILE *f;
    f=fopen("test.txt","rb");
    fread(&x,sizeof(x),1,f);
    fclose(f);
    printf("'%s' - %d %f\n", x.name, x.quantity, x.price);
    return 0;
}

“test” 字符串只是一个例子。实际上,我有一个包含更长名称的数组。然而,我尝试忽略字符串,并只写入文件数量,但它显示了一个空文件。如果我尝试在控制台中打印数量,它会显示正确的值... - flaviumanica
2
@flaviumanica 可能是因为您正在使用文本编辑器打开二进制文件。在这种情况下,以二进制形式编写的数字看起来不正确 - 它们会显示为“垃圾字符”或被文本编辑器解释为行尾标记。 - Sergey Kalinichenko

1
根据你的代码,你试图写入x的地址。但如果你想写入整个对象,那么你需要先将对象序列化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接