【发布时间】:2012-04-02 23:12:26
【问题描述】:
我在 C++ 中使用 fread() 来读取非常大的二进制文件 (100MB-2GB)。二进制文件最初是通过输出一系列“数据包”从 C++ 编写的。数据包由直接写入文件的“头”结构(包含大小字段)和大小等于写入头的大小的二进制内容组成。读取文件时,数据包被循环,头部被读入结构,内容被读入头部中提供的大小的空指针。
这是一种已经在其他工具中实现的已知工作方法(这意味着我可以验证我正在尝试读取的文件)。假设我们正在使用的所有文件都经过验证。在至少一个文件中,我读取二进制文件的实现工作正常。
但是,使用另一个文件 fread() 开始表现得很时髦,没有明显的原因。在多次成功读取之后,我使用以下命令干净地读取了数据包的标头部分:
if (sizeof(stHdr) != fread((void *)&stHdr, 1, sizeof(stHdr), fi))
通过干净读取,我的意思是 fread() 按预期返回“sizeof(stHdr)”,而 feof(fi) 和 ferror(fi) 都返回 0。但是...... stHdr 完全用全零填充; stHdr 中每个字段的值都包含 0x0。我已经验证了二进制文件的格式是否正确,并且在我正在读取的位置有数据。
有没有人见过这种情况或知道是什么原因造成的?
谢谢!
【问题讨论】:
-
如果我看到了,我的第一个想法是我一定是打开了错误的文件。
-
读入一个缓冲区而不是一个结构,看看你是否仍然得到全 0。 struct 与 C 中的不完全一样......尽管它应该将其视为 POD(普通旧数据),但它可能出于多种原因将其视为一个类,并且覆盖它指向的数据可能会适得其反