Подтвердить что ты не робот

Чтение файлов размером более 4 ГБ с использованием С++ stl

Несколько недель назад я использовал std:: ifstream для чтения в некоторых файлах, и он сразу же отключился, потому что файл был больше 4 ГБ. В то время я не мог найти достойного ответа относительно того, почему он был ограничен 32-битными размерами файлов, поэтому я написал свой собственный, используя собственный OS API.

Итак, теперь мой вопрос: есть ли способ обрабатывать файлы размером более 4 ГБ, используя std:: ifstream/std:: ostream (IE: standard С++)

EDIT: использование реализации STL из компилятора VC 9 (Visual Studio 2008). EDIT2: Конечно, должен быть стандартный способ поддержки файлов размером более 4 ГБ.

4b9b3361

Ответ 1

По-видимому, это зависит от того, как библиотека off_t реализуется.

#include <streambuf>
__int64_t temp=std::numeric_limits<std::streamsize>::max();

дает вам то, что текущий макс.

STLport поддерживает более крупные файлы.

Ответ 2

Я столкнулся с этой проблемой несколько лет назад, используя gcc в Linux. ОС поддерживала большие файлы, а библиотека C (fopen и т.д.) Поддерживала ее, но стандартная библиотека С++ этого не делала. Я выяснил, что мне пришлось перекомпилировать стандартную библиотеку С++ с использованием правильных флагов компилятора.

Ответ 3

От стандартной точки зрения ничего не мешает этому. Однако на самом деле большинство 32-битных реализаций используют 32bit для std::size_t. Теперь стандарт С++ предусматривает, что стандартный распределитель в стандартной библиотеке С++ использует std:: size_t в качестве величины. Таким образом, вы ограничены 2 ^ 32 байтами хранения для контейнеров, строк и т.д. Ситуация может быть другой для std::off_t, я точно не знаю, что там происходит.

Вы должны использовать собственный API OS напрямую или какую-либо библиотеку, чтобы сделать это, без необходимости доверять реализациям стандартной библиотеки, которые в значительной степени зависят от реализации.

Ответ 4

Если вы можете отвлечь себя от использования только стандартного С++, вас может заинтересовать boost:: iostreams.

Ответ 5

Как минимум в VS2013, стандартный поток С++ работает с большими файлами ( > 4GBytes).

Я тестировал VS2013 (с обновлением 3).

int64_t file_pos = 4LL * 1024 * 1024 * 1024 + 1;
file.seekp( file_pos, SEEK_SET );
assert( file );
cout << "cur pos: " << file.tellp() << endl; // the output is: 4294967297(4GB + 1)

Следующая ссылка является дополнительной подтверждением того, что она была исправлена ​​и исправлена: https://connect.microsoft.com/VisualStudio/feedback/details/627639/std-fstream-use-32-bit-int-as-pos-type-even-on-x64-platform

для краткости: Стефан Т. Лававей (Разработчик библиотек Visual С++) сказал

Мы исправили его, и исправление будет доступно в VC11... так что большая поддержка файлов должна работать правильно (независимо от платформы x86/x64)