Является std::streampos
гарантированно будет unsigned long long
?
Если нет, то как std::istream::seekg
правильно работать с файлами больше 4G?
От http://en.cppreference.com/w/cpp/io/fpos:
std::streampos
это специализация шаблона класса
template< class State > class fpos;
std::streampos
Тип определен, чтобы быть std::fpos<std::char_traits<char>::state_type>
Каждый объект типа fpos
содержит байтовую позицию в потоке (обычно как закрытый член типа std::streamoff
).
От http://en.cppreference.com/w/cpp/io/streamoff:
Тип std::streamoff
является целочисленным типом со знаком достаточного размера для представления максимально возможного размера файла, поддерживаемого операционной системой. Как правило, это typedef для long long
,
Чтобы ответить на ваши вопросы …
Вопрос Является std::streampos
гарантированно будет unsigned long long
?
Ответ Я уверен, что вы имели в виду выяснить, гарантированно ли базовый целочисленный тип, содержащий позицию unsigned long long
, В этом смысле реальный вопрос заключается в том, std::streamoff
гарантированно будет unsigned long long
, Ответ на этот вопрос «Нет», как вы можете сделать из приведенного выше описания.
Вопрос Если нет, то как std::istream::seekg
правильно работать с файлами больше 4G?
Ответ Если операционная система поддерживает работу с файлами размером более 4G, это std::streamoff
соответственно напечатано. Даже тогда, скорее всего, это будет целочисленный тип со знаком. Вот еще одна цитата из http://en.cppreference.com/w/cpp/io/streamoff.
Значение std :: streamoff -1 также используется для представления условий ошибки некоторыми функциями библиотеки ввода-вывода.
Нет, это не гарантировано unsigned long long
,
Особенно со старыми компиляторами, он может не работать с файлами размером более 4 ГБ (и в некоторых случаях он был подписан, поэтому он работал только с файлами до 2 ГБ — но когда типичные жесткие диски были от 20 до 40 мегабайт, это, вероятно, не казалось серьезным соображением).