我可以使用标准库在 C 中寻找超过 2GB 的位置吗?

Can I seek a position beyond 2GB in C using the standard library?

我正在制作一个用 C 语言读取磁盘映像的程序。我正在尝试制作一些可移植的东西,所以我不想使用太多 OS 特定的库。我知道有很多磁盘映像是非常大的文件,但我不确定如何支持这些文件。

我已经阅读了 fseek,它似乎使用了 long int,它不能保证支持超过 231-1 的值。 fsetpos 似乎支持 fpos_t 更大的值,但无法指定绝对位置。我也有关于使用 fseek 的几个相对搜索,但我不确定这是否可移植。

如何在 C 中支持可移植的大文件?

你不能用标准 C 做到这一点。即使有相对查找,它在某些体系结构上也是不可能的。

一种方法是在编译时检查平台。您可以只检查 LONG_MAX 的值,如果它不够大则抛出编译错误。但即使这样也不能保证底层文件系统支持大于 2 或 4GB 的文件。

更好的方法是使用编译器提供的预处理器宏来检查正在编译代码的操作系统,并编写特定于操作系统的代码。操作系统应该提供一种方法来检查文件系统是否实际支持大于 2GB 或 4GB 的文件。

没有可移植的方式。

在Linux上有fseeko()ftello(),对(需要一些定义,检查ftello())。

在Windows,我相信你必须使用_fseeki64() and _ftelli64()

#ifdef是你的朋友

pread() 适用于任何 POSIX 兼容平台(OS X、Linux、BSD 等)。它在 Windows 上丢失了,但是有很多标准的东西 Windows 出错了;这不会是您的代码库中唯一需要 Windows 特例的东西。