C++ использует тип streamoff
для представления смещения в (файловом) потоке и определяется следующим образом в [stream.types]:
using streamoff = implementation-defined ;
Тип streamoff является синонимом одного из основных целочисленных типов со знаком достаточного размера, чтобы представить максимально возможный размер файла для операционной системы. 287)
287) Типично длинный длинный.
Это имеет смысл, поскольку позволяет выполнять поиск в больших файлах (в отличие от использования long
, ширина которого может составлять всего 32 бита).
[filebuf.virtuals] определяет функцию basic_filebuf
для поиска в файле следующим образом:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_type
эквивалентно streamoff
, см. [iostreams.limits.pos]. Однако затем стандарт продолжает объяснять эффекты функции. Меня раздражает самое последнее предложение, которое требует вызова fseek
:
Эффекты: пусть
width
обозначаетa_codecvt.encoding()
. Еслиis_open() == false
илиoff != 0 && width <= 0
, то операция позиционирования не выполняется. В противном случае, еслиway != basic_ios::cur
илиoff != 0
, и если была выведена последняя операция, то обновить выходную последовательность и записать любую несдвигаемую последовательность. Далее ищите новую позицию: еслиwidth > 0
, звонитеfseek(file, width * off, whence)
, иначе звонитеfseek(file, 0, whence)
.
fseek
принимает параметр long
. Если off_type
и streamoff
определены как long long
(как это предлагается стандартом), это может привести к преобразованию с понижением частоты в long
при вызове fseek(file, width * off, whence)
(что потенциально затрудняет диагностику ошибок). Это ставит под сомнение все обоснование введения типа streamoff
в первую очередь.
Это сделано намеренно или дефект стандарта?
seekoff
обязательно используетfseek
под капотом. Скорее, (предположительно знакомое?) поведениеfseek
используется для объяснения того, что делаетseekoff
. - person jjramsey   schedule 13.12.2019fseek
, если она делает что-то с тем же эффектом. Ноfseek
со смещением меньшеLONG_MIN
или большеLONG_MAX
не действует, поэтому объяснение в лучшем случае неполное, по крайней мере для реализаций, гдеstreamoff
шире, чемlong
. - person Keith Thompson   schedule 14.12.2019