STL ограничение на работу с файлами (fstream/ifstream/ofstream) в 2 Гб (fseek/_fseeki64, тип streamoff) в Visual Studio 2008, 2010, borland builder, rad studio c++

И так проблема: не удаётся даже относительно передвигаться по потоку fstream/ifstream/ofstream. Плюс в добавок нельзя узнать позицию за пределами 2 Гб (ftellg).
Обе проблемы есть в Visual Studio 2008 SP1. (VS 9.0).
Сразу рекомендую переходить на 2010 и более свежую VS.

Visual Studio 2008 SP 1 (9.0), Visual Studio 2005

 

1. Абсолютное смещение в fpos (fpos_t) хранится в 64битном типе как подобает (достать его можно при помощи seekpos()).
2. tellg и тому подобные функции не работают, потому что используют 32битную версию fseek(). (Хотя явно напрашивается использование макроса _FSEEK_OFF)

Решение 0. Использовать Visual Studio 2010 — там всё ок.
Решение 13. Написать свой блекджек. Делаем свой ownifstream (наследуюясь от basic_istream >, так же ownifstream, ownfilebuf наследуясь от basic_filebuf. Hint: чтобы унаследовать C-декриптор файла, придётся задефайнить private как protected на время инклюда fstream. Так же нужно написть свой own_long_pointer_traits. Свой пример не привожу — не слинковался по неизвестым причинам.
Решениe 13-1. Попроще: всё также, только наследоваться от istream/ostream/filebuf. И использовать для определения позиции только myStream.tellg().seekpos().

Builder: Embarcadero RAD Studio XE2

fpos_t — long (stdio.h)
streamoff — _Longlong (fpos приводится к этому типу, например my_ifstream.tellg() возарщает fpos)
использует fseek с типом long для смещения указателя по файлу

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *