我可以使用标准库在C中寻找超过2GB的位置吗?
我正在制作一个用C语言读取磁盘映像的程序。我正在尝试制作可移植的东西,所以我不想使用太多特定于操作系统的库。 我知道有很多磁盘映像是非常大的文件,但我不确定如何支持这些文件。
我已经阅读了fseek
,它似乎使用了一个long int
,它不能保证支持超过2 31 -1的值。 fsetpos
似乎使用fpos_t
支持更大的值,但无法指定绝对位置。 我也有关于使用fseek
几个相对寻求,但我不确定这是否便携。
如何在C中支持可移植地支持大文件?
没有便携的方式。
在Linux上有fseeko()
和ftello()
,对(需要一些定义,检查ftello()
)。
在Windows上,我相信你必须使用_fseeki64()
和_ftelli64()
#ifdef
是你的朋友
pread()
适用于任何符合POSIX标准的平台(OS X,Linux,BSD等)。 它在Windows上缺失但是有很多标准的东西,Windows出错了; 这不是代码库中唯一需要Windows特殊情况的东西。
你不能用标准的C来做。即使有相对的搜索,在一些架构上也是不可能的。
一种方法是在编译时检查平台。 您可以检查LONG_MAX的值,如果它不够大,则抛出编译错误。 但即便如此也不能保证底层文件系统支持大于2或4GB的文件。
更好的方法是使用编译器提供的预处理器宏来检查正在编译代码的操作系统,并编写特定于操作系统的操作系统。 操作系统应提供一种方法来检查文件系统是否实际支持大于2GB或4GB的文件。