seekg и seekp: разница между поиском (streampos pos) и поиском (streamoff off, ios :: beg)

Если мы посмотрим на документацию 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 );

Какая разница между этими двумя функциями вместо стандартных четырех?

1

Решение

streampos является typedef для std::fpos<std::char_traits<char>::state_type> которая содержит текущую позицию в потоке, а также текущее состояние сдвига. Схемы многобайтового кодирования, такие как shift-jis, имеют кодирование, зависящее от состояния. В основном это означает, что в зависимости от предыдущей последовательности символов способ интерпретации определенного байта в потоке может отличаться. С streampos Вы не только удерживаете позицию в потоке, но также сохраняется состояние сдвига в этой точке потока. Кроме того, поскольку переводы строк и т. Д. Интерпретируются по-разному в разных системах, поэтому логическое положение в текстовом файле может отличаться от его фактического физического положения. Вот некоторые из причин, почему streampos не может быть простым целочисленным типом.

3

Другие решения

Библиотека iostreams довольно сложна и сложна. Типы streampos а также streamoff являются от реализации, и реализация не обязана делать их целыми числами, которые связаны так, как вы предлагаете.

Например, возможно, что реализация предоставляет более крупные и мощные прокси-объекты, которые представляют понятие позиции и смещения соответственно, и в этом случае пользователь может захотеть иметь возможность искать непосредственно с таким объектом, а не преобразовывать один в другой вручную.

0

По вопросам рекламы [email protected]