【问题标题】:Fopen failing for binary file二进制文件的Fopen失败
【发布时间】:2009-11-17 05:17:05
【问题描述】:

我有一个巨大的二进制文件,大小为 2148181087 字节 (> 2gb)

我正在尝试做fopen (file, "r"),但失败了

无法打开:xyz 文件(值太 大要存储在数据类型中)

当文件大小 > 2gb 时,我在手册页上看到 EOVERFLOW 错误。

奇怪的是,我使用了一个不同的输入文件,它也“几乎”和第一个文件一样大 2142884400 字节(也 >2gb),fopen 可以正常工作。

fopen 的文件大小是否有任何限制,或者有没有其他方法可以解决这个问题?

【问题讨论】:

  • 需要注意的是,为了便于移植,二进制文件应该使用“rb”。使用“r”读取二进制文件至少在 Windows 上会失败。

标签: c memory-management fopen


【解决方案1】:

截止值是 2GB,与您的想法相反,它不是 2,000,000,000 (2x10003)。

是 2,147,483,648 (2x10243)。因此,您的第二个有效文件实际上小于 2GB)。

2GB,在计算机世界中,在硬盘制造商的心目中只有 2,000,000,000,所以他们可以说他们的磁盘比实际更大:-) - 这让他们说他们的磁盘实际上是 2.1GB。

【讨论】:

  • @jpinto3912: en.wikipedia.org/wiki/Gigabyte : "今天单位千兆字节的使用仍然不明确:它的值可能取决于使用的上下文。当提到磁盘存储容量时,它通常表示 1000^3 字节。”
【解决方案2】:

“解决此问题的替代方法”取决于您使用的操作系统/库。

对于 GNU C 库,you can use fopen64 作为fopen 的替代品;它使用 64 位文件句柄(还有一个宏可以让 fopen 使用 64 位文件句柄)。

对于 Windows,您可能必须切换到 Win32 文件管理 API,您可以使用 CreateFile

【讨论】:

  • 我刚刚从手册页中发现了有关 fopen64 位系统调用的信息。我目前在 UNIX 平台上。我刚刚尝试了这个系统调用并且它有效。 64位文件句柄是什么意思? ) 是用 64 位边界做一些事情吗?如果我使用 fopen64() 在应用程序中读取二进制文件时会不会有什么不良影响?
  • 它返回的FILE* 仍然与fopen 返回的类型相同,只是设置了O_LARGEFILE 标志。文件句柄可以像任何其他具有典型 I/O 功能的文件句柄一样使用。
  • 对于遇到此问题的其他人,我建议在您的 gcc 命令行(或等效地在您的 makefile)中设置 -D_FILE_OFFSET_BITS=64。出于某种原因,在您的代码中使用#define not 似乎具有相同的效果。这个答案提供了我认为对您的选择最好的总结:stackoverflow.com/a/1035713/3561
猜你喜欢
  • 2021-12-17
  • 2013-02-26
  • 2017-03-28
  • 2021-07-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多