Подумалось о том, не будет ли проблем у стримов с файлами от 4-х (или 2-х) гигабайт. std::basic_i(o)stream::pos_type и ::off_type по умолчанию это long, то есть на 32-х битной платформе - 32 бита, то есть проблема будет. ::off_type и ::pos_type берутся из char_traits, который передается стриму через шаблонный параметр. Кажется очевидным, что нужно просто определить свой char_traits и установить в качестве ::off_type и ::pos_type - long long int. Однако, может так оказаться, что низлежащее апи просто не будет уметь работать с 64-х битными размерами (чего я собственно и боюсь). Если у кого-нибудь был опыт на MSVC 9+, gcc, icc - отпишитесь пожалуйста что и как. Ну или просто кто знает
Если не волнует переносимость, то CreateFile и SetFilePointerEx прекрасно работают с огромными файлами
redcat Волнует. Должно работать на винде, нуксах/никсах и на макоси. Сами по себе - да. Вопрос в том, будут ли параметры делигироваться должным образом в функции, которые принимают младшую и старшую части 64-х битных значений разными параметрами.
Не понимаю отчего с этим проблема. Максимальный размер файлов зависит от файловой системы (FAT32 - 4гб, NTFS - 2^65). Какой смысл ограничивать fstream в 2^32? fstream::off_type - 32 бита. Но fstream::pos_type это структура, в которой первый мембер - long, а второй - __int64. С записью и чтением больших файлов, на ntfs под win32, fstream справляется успешно, как собственно и с seek-ом. Единственный нюанс только в том, что относительное смещение это off_type(+-2gb), а абсолютное - pos_type(__int64), со всеми как говориться вытекающими. Пример вызова seek-a, с "большим" абсолютным смещением: Код (Text): ifs.seekg(std::fstream::pos_type(0, abs_pos));
Попробывал использовать fstream с файлами > 2ГБ. Как относительная, так абсолютная установка указателя результата не дает (а seekp успешно обрезает файл ровно до 2ГБ). Может конечно библиотека старая (VC2003), но по-ходу дела второй мембер pos_type (котрый __int64) опеределн для x64.