在 C 中寻找过去 2GiB 的最佳方法是什么?

What is the best way to seek past 2GiB in C?

在 C:

中似乎有很多不同的查找方式

许多似乎有 *64() 个版本:

更复杂的是,许多似乎需要宏定义(如 _LARGEFILE64_SOURCE_GNU_SOURCE)可用或使用 64 位版本。

在 Windows、Linux、Mac、BSD、Solaris 等平台上使用 ANSI C 来保证 64 位 IO 的最简单方法是什么,从什么时候开始有了它每个人都支持 OS?

代码作品需要至少使用以下限制之一::

  1. long是64位+,那就用fseek()

  2. 只查找代码由于fread(), fgets(), fscanf(), fgets()而到过的位置,因此使用fgetpos()fsetpos()。如果文件是文本文件,这是最好的方法。

  3. 可以访问依赖于平台的 64 位搜索,例如 lseek64()

  4. 多个 32 位 fseek().

  5. rewind()fgetc()/fread() 中使用非常低效的代码。

What is the easiest way to guarantee 64-bit IO using ANSI C on Windows, Linux, Mac, BSD, Solaris, etc.

最简单的方法?将您的代码编译为 64 位可执行文件。请务必使用正确的类型,例如size_t 而不是 unsigned int - size_tsize_t。希望您已经超越了 ANSI C,因为它通常指的是 C89,并且可能不支持 64 位架构。

正如评论中所暗示的那样,没有任何符合 C 标准的方法可以保证您可以轻松超过 2GB。但是,对于 64 位二进制文​​件,POSIX 兼容的 IO(open()read()write() 等)都可以作为 size_t/ ssize_t POSIX 使用的 IO 是 64 位的。 POSIX 还指定了 fseeko() and ftello(),它们是 64 位兼容的。

and since when has it been supported by each OS?

有关详细信息,请参阅 here。粗略地说,"full" 64 位支持日期大约为以下时间:

  • 索拉里斯:1998
  • Linux: 2003
  • Windows: 2006
  • OS X: 2007