Гарантируется ли, что std ::streampos будет беззнаковым long long?

#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