#c #file #types #integer #unsigned-long-long-int
#c #файл #типы #целое число #unsigned-long-long-int
Вопрос:
std::streampos
Гарантировано ли это unsigned long long
?
Если это не так, как правильно std::istream::seekg
работать с файлами размером более 4G?
Ответ №1:
Из 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 to 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, также используется для представления условий ошибки некоторыми функциями библиотеки ввода-вывода.
Комментарии:
1.
streamoff
определенно подписано. Можете ли вы объяснить переход оттуда к созданиюstreampos
signed также?2. @BenVoigt, это была опечатка. Спасибо, что заметили и дали мне знать 🙂
Ответ №2:
Нет, это не гарантировано unsigned long long
.
Особенно со старыми компиляторами, он может не работать с файлами размером более 4 ГБ (и в нескольких случаях он был подписан, поэтому он работал только с файлами объемом до 2 ГБ — но когда типичные жесткие диски составляли от 20 до 40 мегабайт, это, вероятно, не казалось важным соображением).
Комментарии:
1. В каких случаях должно
std::streampos
быть подписано?2. Я думаю, что он может быть подписан только в предварительно стандартных iostreams