Как записать файл размером >4Gb в C++?

В процессе решения одной учебной задачи столкнулся со следующей проблемой.

В существующий пустой файл можно добавить данные следующим образом:

ofstream ofs("file", ios_base::binary | ios_base::in | ios_base::ate);
long long pos = 5000000000;
ofs.seekp(pos, ios_base::beg);
ofs.write(as_bytes(pos), sizeof(pos));
ofs.close();


При этом файлы больше 4 Гб создаются таким образом без проблем. Но как только размер файла пересекает «заветную» цифру, добавлять данные таким образом не получается.

Вопроса три:
1. В чем не прав?
2. Как исправить?
3. Что обычно используют для работы с большими файлами?

В дополнение:
— NTFS
— VC2010 32b
— Windows 7 x64
  • Вопрос задан
  • 4778 просмотров
Решения вопроса 1
@Next_Alex
Что-то мне подсказывает что проблема в том что размер типа int, который используется в ofstream::seekp и в ofstream::write равен 4 байта. А это значит что с помощью этих методов принципиально нельзя записать больше 4 Гб.
Здесь есть ответ:
stackoverflow.com/questions/293672/reading-files-larger-than-4gb-using-c-stl
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
ixSci
@ixSci
1. Если у Вас используется ofstream, то флаг должен быть ios_base::out, а не ios_base::in
2. Честно говоря, я не знаю, можно ли расширять файл способом, который Вы используете. Я не нашел ни опровержений ни доказательств этому. Но если учесть, что seekp устанавливает указатель внутри последовательности, я бы не стал надеяться на гарантированное поведение в подобном случае.
3. VS 2010 STL работает с файлами размером 2^64, так что в этом затыка нет.
Ответ написан
@Next_Alex
В таком случае врет не только MSDN.
Кстати еще неизвестно как это значение обрабатывает сам seekg :)
В общем, я все равно не вижу смысла пользоваться стандартными потоками ввода-вывода — с ними только вечные пляски с бубном, плюс в режиме append не запишешь данные в произвольную позицию :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы