Чтение файлов размером более 4 ГБ с использованием c ++ stl - PullRequest
17 голосов
/ 16 ноября 2008

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

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

РЕДАКТИРОВАТЬ: Использование реализации STL из компилятора VC 9 (Visual Studio 2008). РЕДАКТИРОВАТЬ 2: Конечно, должен быть стандартный способ поддержки файлов размером более 4 ГБ.

Ответы [ 5 ]

14 голосов
/ 16 ноября 2008

Очевидно, это зависит от того, как off_t реализован библиотекой.

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

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

STLport поддерживает файлы большего размера.

5 голосов
/ 16 ноября 2008

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

2 голосов
/ 16 ноября 2008

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

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

0 голосов
/ 03 июня 2015

По крайней мере в VS2013 стандартный файловый поток C ++ хорошо работает с большими файлами (> 4 ГБ).

Я тестировал на 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 C ++) сказал

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

0 голосов
/ 18 ноября 2009

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

...