Обработка файлов размером более 2 ГБ в C ++ с помощью STL - PullRequest
7 голосов
/ 10 декабря 2010

Я выполняю двоичную обработку файлов, и в моем алгоритме я хотел бы знать фактический тип pos_type и off_type, например, при вычислении размера файла или при поиске в заданную позицию (tellg и seekg).

При вычислении размера файла я просто static_cast pos_type до int64_t, и, кажется, работает нормально.

Как насчет seekg? Безопасно ли передавать ему int64_t?

Есть ли способ заставить pos_type и off_type быть int64_t, , возможно, используя traits

Я хотел бы устранить отвратительное приведение и найти способ, который соответствует стандарту C ++.

Обновление: см. Также

Ответы [ 2 ]

10 голосов
/ 10 декабря 2010

Не все компиляторы имеют реализации STL с поддержкой больших файлов.

Например, следующая программа:

#include <fstream>
#include <iostream>
#include <limits>

int main()
{
    using namespace std;

    cout << numeric_limits<streamoff>::max() << endl;
}

Результат:

  • VS2005 - 2147483647
  • VS2008 - 2147483647
  • VS2010 - 9223372036854775807
  • MinGW GCC 4.4.0 - 9223372036854775807

С другой стороны STLPort поддерживает большие файлы кроссплатформенных файлов.

1 голос
/ 10 декабря 2010

Вы, вероятно, должны использовать std :: fpos_t typedef.

...