Если мы посмотрим на документацию istream и ostream, у нас есть следующие функции:
istream& seekg ( streampos pos );
istream& seekg ( streamoff off, ios_base::seekdir dir );
ostream& seekp ( streampos pos );
ostream& seekp ( streamoff off, ios_base::seekdir dir );
Интересно, почему существуют две формы функций каждый раз, а не только:
istream& seekg ( streamoff off, ios_base::seekdir dir = ios_base::beg );
ostream& seekp ( streamoff off, ios_base::seekdir dir = ios_base::beg );
Какая разница между этими двумя функциями вместо стандартных четырех?
streampos
является typedef для std::fpos<std::char_traits<char>::state_type>
которая содержит текущую позицию в потоке, а также текущее состояние сдвига. Схемы многобайтового кодирования, такие как shift-jis, имеют кодирование, зависящее от состояния. В основном это означает, что в зависимости от предыдущей последовательности символов способ интерпретации определенного байта в потоке может отличаться. С streampos
Вы не только удерживаете позицию в потоке, но также сохраняется состояние сдвига в этой точке потока. Кроме того, поскольку переводы строк и т. Д. Интерпретируются по-разному в разных системах, поэтому логическое положение в текстовом файле может отличаться от его фактического физического положения. Вот некоторые из причин, почему streampos
не может быть простым целочисленным типом.
Библиотека iostreams довольно сложна и сложна. Типы streampos
а также streamoff
являются от реализации, и реализация не обязана делать их целыми числами, которые связаны так, как вы предлагаете.
Например, возможно, что реализация предоставляет более крупные и мощные прокси-объекты, которые представляют понятие позиции и смещения соответственно, и в этом случае пользователь может захотеть иметь возможность искать непосредственно с таким объектом, а не преобразовывать один в другой вручную.