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делает.
fseekесли она делает что-то с тем же эффектом. Но fseekсо смещением, меньшим LONG_MINили большим, чем LONG_MAXне имеет значения, поэтому объяснение в лучшем случае неполное, по крайней мере для реализаций, где streamoffоно шире long.