【问题标题】:how to handle file whose size is more than 2 GB?如何处理大小超过 2 GB 的文件?
【发布时间】:2011-08-08 09:25:41
【问题描述】:

在 c fseek,fopen 中,所有函数都适用于 long int 意味着只处理 2 gb 的文件。 现在如何打开大小超过 2 GB 的文件?

【问题讨论】:

  • 这是一个特定于平台的问题,而不是“C”问题。
  • @Mr.32:这取决于。那个 64 位平台是如何实现 fseek 的?
  • 把你的昵称改成Mr.64。
  • fopen 不依赖于 long 的大小。如果您不需要 fseek,而只需按顺序读取文件就可以了。此外,在 一些 64 位系统上,long 是 64 位。

标签: c


【解决方案1】:

正如评论者已经解释的那样,是否可以打开超过 2GB 的文件取决于操作系统和 C 库,而不是 sizeof(long) 上的编译器。如果您的操作系统支持此类文件,您应该能够fopen 它们,尽管您可能需要设置一个标志(#define _FILE_OFFSET_BITS 64 用于 Linux)。

那么,fseek 确实不能在一次调用中寻找比LONG_MAX 更远的位置。您可以在一个循环中多次调用fseek,这可能很麻烦,或者检查您的平台是否有fseeko,它采用off_t 类型的偏移参数。如果您设置正确的选项,该类型应该足够大以捕获系统上任何(常规)文件的大小。 fseeko 适用于较新的 Linux 和所有符合 POSIX-2001 的操作系统。

【讨论】:

  • 投反对票,想解释一下吗?我想知道我是否犯了错误。
  • 在 32 位 Linux Ubuntu 13.x 上。 fopen 有这个问题,没有 fseek。需要#define _FILE_OFFSET_BITS 64 才能让程序甚至打开大文件。所以,不,这并不总是操作系统限制,有时只是 C 库中的硬编码垃圾。
  • @AndrewJohnson 这与我的回答并不矛盾:您至少需要操作系统支持才能使其工作,而_FILE_OFFSET_BITS 就是答案。
  • 它直接与您的第一段相矛盾。我的操作系统支持此类文件,但我不能只 fopen 它们。 C 需要预处理器指令才能在支持大文件的情况下进行编译。
  • @AndrewJohnson:好的。使答案更准确,请检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 2011-09-27
  • 2011-06-30
  • 2018-07-26
相关资源
最近更新 更多