поддержка iostream и больших файлов
-
20-08-2019 - |
Вопрос
Я пытаюсь найти окончательный ответ и не могу, поэтому надеюсь, что кто-нибудь может знать.
Я разрабатываю приложение на C ++ с использованием GCC 4.x в Linux (32-разрядная ОС).Это приложение должно иметь возможность читать файлы размером более 2 ГБ.
Я бы действительно хотел использовать материал iostream противУказатели на файлы, но я не могу найти, влияет ли большой файл #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
/и т.д.
Обновить
Вам не нужно беспокоиться о лимите в 2 ГБ до тех пор, пока вам не нужно / пытаться fseek
или ftell
(вы просто читаете из потока или записываете в него.)
Другие советы
Если вы используете GCC, вы можете воспользоваться расширением GCC под названием __gnu_cxx::stdio_filebuf, которое привязывает IOStream к стандартному C ФАЙЛ дескриптор.
Вам нужно определить следующие две вещи:
_БОЛЬШОЙ ФАЙЛ_ИСТОЧНИКА
_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;
}