C ++ usa el streamofftipo para representar un desplazamiento dentro de una secuencia (archivo) y se define de la siguiente manera en [stream.types]:
using streamoff = implementation-defined ;El tipo streamoff es sinónimo de uno de los tipos integrales básicos firmados de tamaño suficiente para representar el tamaño de archivo máximo posible para el sistema operativo. 287)
287) Típicamente largo largo.
Esto tiene sentido porque permite buscar dentro de archivos grandes (en oposición al uso long, que puede tener solo 32 bits de ancho).
[filebuf.virtuals] define basic_filebufla función de buscar dentro de un archivo de la siguiente manera:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_typees equivalente a streamoff, vea [iostreams.limits.pos]. Sin embargo, el estándar continúa explicando los efectos de la función. Estoy irritado por la última oración, que requiere una llamada a fseek:
Efectos : Dejar
widthdenotara_codecvt.encoding(). Siis_open() == false, ooff != 0 && width <= 0, entonces la operación de posicionamiento falla. De lo contrario, siway != basic_ios::curooff != 0, y si se emitió la última operación, actualice la secuencia de salida y escriba cualquier secuencia sin desplazamiento. Luego, busque la nueva posición: siwidth > 0, llamefseek(file, width * off, whence), de lo contrario llamefseek(file, 0, whence).
fseekacepta un longparámetro Si off_typey streamoffse definen como long long(como lo sugiere el estándar), esto podría conducir a una conversión descendente a la longhora de llamar fseek(file, width * off, whence)(lo que podría generar errores potencialmente difíciles de diagnosticar). Esto pone en tela de juicio toda la justificación para introducir el streamofftipo en primer lugar.
¿Es esto intencional o un defecto en el estándar?
seekoffnecesariamente se use fseek debajo del capó. Más bien, el comportamiento (¿presumiblemente familiar?) De fseekse utiliza para explicar lo que seekoffestá haciendo.
fseeksiempre que haga algo con el mismo efecto. Pero fseekcon un desplazamiento menor LONG_MINo mayor que LONG_MAXno tiene ningún efecto, por lo que la explicación es, en el mejor de los casos, incompleta, al menos para implementaciones donde streamoffes más amplia que long.