C ++:fread()返回非零值,但只将零值插入缓冲区

时间:2012-04-02 23:12:26

标签: c++ file-io fread

我在C ++中使用fread()来读取非常大的二进制文件(100MB-2GB)。二进制文件最初是通过输出一系列“数据包”从C ++编写的。数据包由直接写入文件的“标题”结构(包含大小字段)构成,然后是大小等于写入标题的大小的二进制内容。在读取文件时,数据包将循环遍历,标头将被读入结构,内容将被读入标头中提供的大小的void指针。

这是一种已在其他工具中实现的已知工作方法(意味着我可以验证我试图阅读的文件)。假设我们正在使用的所有文件都经过验证。在至少一个文件中,我读取二进制文件的实现工作正常。

然而,有了另一个文件,fread()开始表现得时髦,没有明显的理由。在多次成功读取之后,我使用以下方法干净地读取数据包的标题部分:

if (sizeof(stHdr) != fread((void *)&stHdr, 1, sizeof(stHdr), fi))

通过干净的读取,我的意思是fread()按预期返回“sizeof(stHdr)”,feof(fi)和ferror(fi)都返回0.但是...... stHdr完全被全零填充; stHdr中每个字段的值都包含0x0。我已经验证了要正确形成的二进制文件,并且在我正在阅读的时候有数据。

之前有没有人见过这个或知道可能导致它的原因?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您的文件超过2GB,则需要启用大文件支持。

快速简便的方法是使用-D_FILE_OFFSET_BITS=64进行编译。有关更具针对性的方式和更多详情,请参阅http://www.suse.de/~aj/linux_lfs.html

答案 1 :(得分:0)

问题最终成为PEBKAC的典型案例......

显然我的二进制文件确实在某些时候被破坏了,实际上确实有一堆0。我直接从存储库中复制了它,并且在放入repo之前验证了文件,所以我认为它很好。显然我的本地文件版本发生了一些不好的事情,这是我的问题的根源。