我正试图找到一个明确的答案而不能,所以我希望有人知道。
我正在Linux(32位操作系统)上使用GCC 4.x开发一个C ++应用程序。此应用需要能够读取文件> 2GB大小。
我真的想使用iostream的东西和FILE指针,但是我找不到大文件#defines(_LARGEFILE_SOURCE,_LARGEFILE64_SOURCE,_FILE_OFFSET_BITS = 64)对iostream标头有什么影响。
我正在编译32位系统。任何指针都会有所帮助。
答案 0 :(得分:8)
编译libstdc++
时已经为您决定了这一点,通常取决于_GLIBCXX_USE_LFS
中是否定义了c++config.h
。
如果有疑问,请通过libstdc++.so
(或通过readelf -r
)传递您的可执行文件(或strings
,如果动态链接),并查看您的二进制文件/ libstdc++
与fopen
/ fseek
/等相关联。或fopen64
/ fseek64
/ etc。
<强>更新强>
只要您不需要/尝试fseek
或ftell
(您只需读取或写入流,就不必担心2GB限制。)
答案 1 :(得分:2)
如果您正在使用GCC,您可以利用名为__gnu_cxx :: stdio_filebuf的GCC扩展,它将IOStream绑定到标准C FILE 描述符。
您需要定义以下两件事:
_LARGEFILE_SOURCE
_FILE_OFFSET_BITS = 64
例如:
#include <cstdio>
#include <fstream>
#include <ext/stdio_filebuf.h>
int main()
{
std::ofstream outstream;
FILE* outfile;
outfile = fopen("bigfile", "w");
__gnu_cxx::stdio_filebuf<char> fdbuf(outfile, std::ios::out |
std::ios::binary);
outstream.std::ios::rdbuf(&fdbuf);
for(double i = 0; i <= 786432000000.0; i++) {
outstream << "some data";
fclose(outfile);
return 0;
}