64 位文件 API 在每个平台上都不同。
在 Windows 中:_fseeki64
在 Linux 中:fseeko
在 freebsd 中:又一个类似的调用 ...
如何才能最有效地使其更加方便和便携?有什么有用的例子吗?
最佳答案
大多数基于 POSIX 的平台都支持“_FILE_OFFSET_BITS”预处理器符号。将其设置为 64 将导致 off_t 类型为 64 位而不是 32 位,并且像 lseek() 这样的文件操作函数将自动支持通过一些预处理器魔法进行 64 位偏移。从编译时的角度来看,以这种方式添加 64 位文件偏移量支持是相当透明的,假设您正确使用了相关的 typedef。如果您公开使用 off_t 类型的接口(interface),您的 ABI 自然会发生变化。理想情况下,您应该在命令行上定义它,例如:
cxx -D_FILE_OFFSET_BITS=64
确保它适用于您的代码中包含的所有操作系统 header 。
不幸的是,Windows 不支持此预处理器符号,因此您要么必须自己处理它,要么依赖提供跨平台大文件支持的库。 ACE就是这样一个库(基于 POSIX 和 Windows 平台 - 在这两种情况下只需定义 _FILE_OFFSET_BITS=64)。我知道 Boost.filesystem还支持基于 POSIX 的平台上的大文件,但我不确定 Windows。其他跨平台库可能提供类似的支持。
关于c++ - C++ 中的大文件支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/965725/