std::fstream и файлы > 4GB

Тема в разделе "LANGS.C", создана пользователем _DEN_, 12 май 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Подумалось о том, не будет ли проблем у стримов с файлами от 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 - отпишитесь пожалуйста что и как. Ну или просто кто знает :)
     
  2. mowgli

    mowgli New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    15
    на gcc такое когда-то лобал.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    mowgli

    Ну так и какие результаты-то?
     
  4. redcat

    redcat New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    62
    Если не волнует переносимость, то CreateFile и SetFilePointerEx прекрасно работают с огромными файлами
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    redcat

    Волнует. Должно работать на винде, нуксах/никсах и на макоси.


    Сами по себе - да. Вопрос в том, будут ли параметры делигироваться должным образом в функции, которые принимают младшую и старшую части 64-х битных значений разными параметрами.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Не понимаю отчего с этим проблема. Максимальный размер файлов зависит от файловой системы (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):
    1. ifs.seekg(std::fstream::pos_type(0, abs_pos));
     
  7. redcat

    redcat New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    62
    Попробывал использовать fstream с файлами > 2ГБ. Как относительная, так абсолютная установка указателя результата не дает (а seekp успешно обрезает файл ровно до 2ГБ). Может конечно библиотека старая (VC2003), но по-ходу дела второй мембер pos_type (котрый __int64) опеределн для x64.
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    redcat
    У меня тоже 2003. Дело не в x64. FS какая? Код пожалуйста в студию.