c++ - C++ 中的大文件支持

标签 c++ c 64-bit cross-platform large-files

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/

相关文章:

c - 变量 'input' 周围的堆栈已损坏

c - 将文件读入结构体

java - 我怎样才能告诉python使用64位java?

ios - 最近部署的我的应用程序 - 某些用户现在无法从旧设备运行(64 位问题)

c++ - 性能:Matlab 与 C++ 矩阵 vector 乘法

c++ - std0x 和非 std0x 之间的 Rcpp 不一致

创建结构数组

macos - 在 64 位环境中编译 32 位 OS X 二进制文件

c++ - 隐式转换被认为是一个坏概念吗?

c++ - 从 dtor 安全地抛出异常