【问题标题】:C++: fread() returns non-zero, but only inserts zeros in to bufferC ++:fread()返回非零,但仅将零插入缓冲区
【发布时间】: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(普通旧数据),但它可能出于多种原因将其视为一个类,并且覆盖它指向的数据可能会适得其反

标签: c++ file-io fread


【解决方案1】:

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

执行此操作的快速简便的方法是使用-D_FILE_OFFSET_BITS=64 进行编译。更有针对性的方式,更详细的,见http://www.suse.de/~aj/linux_lfs.html

【讨论】:

  • 我还不能发布答案,但问题最终是我实际上正在处理一个损坏的文件......但是,这是一个非常好的建议,因为我实际上可能正在工作对于以后需要LFS的文件,我会确保从现在开始用它编译。
【解决方案2】:

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

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

【讨论】:

  • '如果我看到了,我的第一个想法是我一定打开了错误的文件' - 我很擅长这个:))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多