1

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

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

这很好用,当我查看文件的内容时,我可以看到我“写入”的HEXint(以及所有其他值)。

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

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

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

我的struct样子是这样的:

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几乎是一样的。

4

2 回答 2

3

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

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

你在哪里写一个struct. 这个结构将有填充字节,根据这篇维基百科文章,它将抵消你的其余数据。您可能必须想出一种更好的方法将该结构写入内存。这个页面提供了额外的解释。

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

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

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

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

于 2013-06-16T16:13:29.157 回答
3

如果你struct从文件中写了一个,你应该读一个struct回;试图阅读 anint是行不通的。但是,它很少(如果有的话)有意义地将两个写为struct包含指针的二进制 a。您应该将它们设为固定大小的数组,或者将它们与您的struct.

编辑:(响应发布的代码)问题很可能与在第二次调用中写入未知数量的字符有关fwrite。当你序列化一个 C 字符串时,你应该在写入字符本身之前写出字符数,这样当你阅读时你就会知道要分配和读回多少字符:

int len = strlen(tmpA->a2);
fwrite(&len, sizeof(int), 1, file);    
fwrite(tmpA->a2, sizeof(char), len, file);
...
fread(&(tmpA->a1), sizeof(int), 1, file);
tmpA->a2 = malloc(tmpA->a1+1);
fread(tmpA->a2, sizeof(char), tmpA->a1, file);
tmpA->a2[tmpA->a1] = '\0';
于 2013-06-16T16:15:12.187 回答