c++ - 如何在 C++ 中正确且可移植地处理大文件(4+ GB)?

标签 c++ linux windows cross-platform large-files

在我的职业生涯中,我从未需要处理如此大的文件作为我应用程序的核心方面,我有点难过。

我的应用程序将在一个文件中记录很多东西,它可能会增长到几千兆字节。该应用程序必须在 Windows(7 以上)和所有现代 Linux(内核 4 以上)上运行,适用于 32 位和 64 位机器

我尝试使用 fread 和 friend ,因为它们是可移植的,但它们都使用 long。我考虑将文件拆分为多个 2 GB 的文件,以便继续使用已签名的 long,但这似乎有点太多处理开销。

是否有一组有助于完成任务的可移植库函数,或者我是否必须围绕平台 API 编写一个精简的包装器?


编辑:回答评论中的一些问题。

  1. 这是一个二进制数据文件。
  2. 我不需要将其全部加载到内存中,但必须寻找偏移量。
  3. 关于使用fstream,根据this 似乎行不通。 ,所以我没有考虑它。

最佳答案

我不认为你可以移植,但这个解决方法可能会有所帮助(未经测试)。

#include <stdint.h>
#include <stdio.h>
#ifdef _MSC_VER
inline int seek64( FILE *stream, int64_t offset, int origin )
{
    return _fseeki64( stream, offset, origin );
}
#else
#define _LARGEFILE64_SOURCE
#include <sys/types.h>
#include <unistd.h>
inline int seek64( FILE *stream, int64_t offset, int origin )
{
    const int fd = fileno( stream );
    return (int)lseek64( fd, offset, origin );
}
#endif

关于c++ - 如何在 C++ 中正确且可移植地处理大文件(4+ GB)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54217552/

相关文章:

windows - Docker-compose 无效绑定(bind)安装规范 "/rootfs:ro": invalid volume specification

c++ - G++ 找不到 boost 库

c++ - 如何避免复制赋值运算符的双重释放或损坏(fasttop)?

linux - 在目录的所有文件名中查找并用另一个单词替换

linux - 在 Linux 中使用 GNU Libc 编译并在 eglibc 上运行的危险?

windows - 窗口区域与分层窗口

python - 使用 SWIG 和 Python/C API 包装一个函数,该函数采用 C++ 类实例的 Python 列表

c++ - 编译器仍然构建并运行第一个创建的文件 (main.cpp),不运行当前文件

php - Imagick PHP 扩展无法输出 JPEG XR 图像

windows - 为什么RtlFillMemory/RtlCopyMemory定义为宏