在我的职业生涯中,我从未需要处理如此大的文件作为我应用程序的核心方面,我有点难过。
我的应用程序将在一个文件中记录很多东西,它可能会增长到几千兆字节。该应用程序必须在 Windows(7 以上)和所有现代 Linux(内核 4 以上)上运行,适用于 32 位和 64 位机器
我尝试使用 fread
和 friend ,因为它们是可移植的,但它们都使用 long
。我考虑将文件拆分为多个 2 GB 的文件,以便继续使用已签名的 long
,但这似乎有点太多处理开销。
是否有一组有助于完成任务的可移植库函数,或者我是否必须围绕平台 API 编写一个精简的包装器?
编辑:回答评论中的一些问题。
- 这是一个二进制数据文件。
- 我不需要将其全部加载到内存中,但必须寻找偏移量。
- 关于使用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/