gpt4 book ai didi

c - 在 C 中使用 fread() 从二进制文件读取时出现奇怪的值

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:56 26 4
gpt4 key购买 nike

我有一个我无法解决的问题...

我使用 fwrite 将一个 int 值(以及来自 struct 的其他值)写入我打开的文件中使用 fopen(file, "wb");

这工作正常,当我查看文件的内容时,我可以看到我“编写”的 intHEX 值(以及所有其他值也是如此)。

接下来,我尝试读取文件。因此,我使用 fopen(file, "rb"); 打开文件并使用 fread 开始读取它。第一个 int 值被正确读取(例如 7),它之后的所有其他值 - 它们属于我编写的第一个 struct

然后我尝试读取下一个 struct,当我尝试读取第一个 int 值时,我收到一个非常奇怪的数字(例如 1140850688),但它应该是39 而不是。

所以问题是:为什么会这样?我该如何解决?

我的结构是这样的:

struct a {
int a1;
char* a2;
struct b* a3;
unsigned char a4;
int a5;
char* a6;
}

fread 调用如下所示:fread(&(tmpA->a1), sizeof(int), 1, file);

编辑:

fwrite 部分:

fwrite(&(tmpA->a1), sizeof(int), 1, file);
fwrite(tmpA->a2, sizeof(char), strlen(tmpA->a2), file);
fwrite(tmpA->a3, sizeof(struct b), 1, file);
fwrite(&(tmpA->a4), sizeof(unsigned char), 1, file);
fwrite(&(tmpA->a5), sizeof(int), 1, file);
fwrite(tmpA->a6, sizeof(char), strlen(tmpA->a6), file);

fread 几乎是一样的。

最佳答案

我怀疑你的问题出在这条线上

fwrite(tmpA->a3, sizeof(struct b), 1, file);

你正在编写一个struct的地方。根据 this wikipedia article,此结构将具有填充字节这将抵消您的其余数据。您可能必须想出一种更好的方法来将该结构写入内存。 This page提供额外的解释。

您可以通过检查 a4 是否具有您期望的值,或者通过比较整个结构的大小与其成员大小的总和来检查这是否确实是问题所在。

此外,这些行看起来很危险:

fwrite(tmpA->a2, sizeof(char), strlen(tmpA->a2), file);
fwrite(tmpA->a6, sizeof(char), strlen(tmpA->a6), file);

他们说正在打印的字符串的长度可能在您存储的数据中有所不同。 strlen 将为您提供字符串的长度,而不计算终止符 \0,因此一旦您编写了字符串,就没有好的方法知道它在哪里结束。我无法想象您打算如何读回字符串。

关于c - 在 C 中使用 fread() 从二进制文件读取时出现奇怪的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17135225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com