C 二进制文件的fseek行为

C 二进制文件的fseek行为,c,file-io,binaryfiles,binary-data,C,File Io,Binaryfiles,Binary Data,我正在使用二进制格式 我注意到了 fseek(fp, offset, SEEK_SET); fread(&mystruct, sizeof(struct mystruct_thing), 1, fp); 产生的输出不同于简单的 fread(&mystruct, sizeof(struct mystruct_thing), 1, fp); 这符合预期的行为 为什么会这样?是因为SEEK_SET覆盖了offset参数吗?fread的第二个参数是要读取的每个项目的大小,在本例中是结

我正在使用二进制格式

我注意到了

fseek(fp, offset, SEEK_SET);
fread(&mystruct, sizeof(struct mystruct_thing), 1, fp);
产生的输出不同于简单的

fread(&mystruct, sizeof(struct mystruct_thing), 1, fp);
这符合预期的行为

为什么会这样?是因为SEEK_SET覆盖了offset参数吗?

fread的第二个参数是要读取的每个项目的大小,在本例中是结构。我不明白你怎么会期望偏移量达到那里——它应该是类似sizeofmystruct的东西


编辑:现在问题已经编辑好了,两段代码产生不同结果的原因很简单,第一段代码在读取前寻找fp的偏移位置,而第二段代码没有。fread从fp的当前位置开始读取sizeofstruct mystruct_thing字节,因此,假设偏移量不是fseek之前的位置,则开始位置不同,因为fseek为将来的读取和写入设置了位置。

第一个片段将从偏移量字节读取结构到文件中,第二个片段将从当前文件位置读取它-如果文件刚刚打开,则为零


最明显的解释可能是偏移量不等于零。

SEEK\u SET是文件的开头,偏移量是超过开头的字节,包括0。例如,如果偏移==siZeOfMyStult,FP指向地址SekKySt+sieFoMyStruts。考虑用sisiof MyStult替换SsieZoFrutsMyStultStION。更容易理解和明显正确,即使您以后更改了类型。@重复数据消除程序同意,虽然从&mystruct的使用来看,似乎mystruct的大小比*mystruct的大小更正确。@William,即使在编辑之后,您的第二段代码也被抵消为第二个参数。@Arkku:这不是答案-它应该作为注释发布。现在William已经修复了这个问题,这毫无意义。@William,好的,但编辑之后这个问题就没有意义了,因为第二段代码没有引用偏移量,因此不能从偏移量中读取。@Clifford这是一个关于为什么问题中的代码像最初发布的一样,产生了不同的结果,即对fread的参数有误解。现在这个问题不再有意义了。也许,但这显然是无稽之谈,因为他说无效代码产生了预期的结果。批评或澄清问题是供评论的。无论如何都不是你的错,而是原来问题的质量差。您现在应该更新或删除答案。