C++中的大文件支持

Mad*_*ish 8 c c++ 64-bit cross-platform large-files

每个平台上的64位文件API都不同.

在windows中:_fseeki64
在linux中:fseeko
在freebsd中:还有另一个类似的调用...

我怎样才能最有效地使它更方便和便携?有什么有用的例子吗?

Voi*_*oid 14

大多数基于POSIX的平台都支持" _FILE_OFFSET_BITS "预处理器符号.将其设置为64将导致off_t类型为64位而不是32位,并且像lseek()这样的文件操作函数将通过某些预处理器魔法自动支持64位偏移.从编译时的角度来看,假设您正确使用相关的typedef,以这种方式添加64位文件偏移支持是相当透明的.当然,如果您公开使用off_t类型的接口,您的ABI将会改变.理想情况下,您应该在命令行中定义它,例如:

cxx -D_FILE_OFFSET_BITS=64
Run Code Online (Sandbox Code Playgroud)

确保它适用于您的代码包含的所有操作系统头文件.

遗憾的是,Windows不支持此预处理程序符号,因此您必须自己处理它,或者依赖提供跨平台大文件支持的库. ACE是一个这样的库(基于POSIX和Windows平台 - 在两种情况下都只定义_FILE_OFFSET_BITS = 64).我知道Boost.filesystem也支持基于POSIX的平台上的大文件,但我不确定Windows.其他跨平台库可能提供类似的支持.