ioStream 및 대규모 파일 지원
-
20-08-2019 - |
문제
나는 결정적인 대답을 찾으려고 노력하고 있고 할 수 없으므로 누군가가 알고 있기를 바라고 있습니다.
Linux (32 비트 OS)에서 GCC 4.X를 사용하여 C ++ 앱을 개발하고 있습니다. 이 앱은 크기가 2GB> 2GB를 읽을 수 있어야합니다.
iostream stuff vs. 파일 포인터를 사용하고 싶지만 큰 파일 #defines (_largefile_source, _largefile64_source, _file_offset_bits = 64)가 ioStream 헤더에 영향을 미치는지 여부를 찾을 수 없습니다.
32 비트 시스템에서 컴파일하고 있습니다. 모든 포인터는 도움이 될 것입니다.
해결책
이것은 이미 당신을 위해 결정되었습니다 libstdc++
편집되었으며 일반적으로 _GLIBCXX_USE_LFS
정의되었습니다 c++config.h
.
의심스러운 경우 실행 파일을 통과하십시오 (또는 libstdc++.so
, 동적으로 연결하는 경우) readelf -r
(또는이를 통해 strings
) 그리고 당신의 이진/가 있는지 확인하십시오.libstdc++
연결 fopen
/fseek
/등. 또는 fopen64
/fseek64
/등.
업데이트
필요하지 않은 한, 2GB 제한에 대해 걱정할 필요가 없습니다. fseek
또는 ftell
(당신은 방금 스트림에서 읽거나 씁니다.)
다른 팁
GCC를 사용하는 경우 __gnu_cxx :: stdio_filebuf라는 GCC 확장을 활용할 수 있습니다. 파일 설명자.
다음 두 가지를 정의해야합니다.
_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;
}