繁体   English   中英

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

[英]Strange value when reading from binary file with fread() in C

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

我使用fwriteint值(以及其他来自struct值)写入使用fopen(file, "wb");

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

接下来,我尝试读取文件。 因此,我使用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几乎是一样的。

如果您从文件中编写了一个struct ,则应该读回一个struct 试图读取一个int是行不通的。 但是,很少,如果有的话,两个包含指针的struct以二进制形式写出是有意义的。 您应该使它们成为固定大小的数组,或者与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';

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

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

您正在编写struct 根据此Wikipedia文章 ,此结构将具有填充字节,这将抵消您的其余数据。 您可能必须提出一种更好的将结构写入内存的方法。 此页面提供其他说明。

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

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

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

他们说要打印的字符串的长度可能在您存储的数据中有所不同。 strlen会为您提供字符串的长度,而不会计算结尾的\\0因此一旦写入,就没有很好的方法知道字符串的结尾。 我无法想象你打算如何读回字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM