C ++ usa el streamoff
tipo 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_filebuf
la 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_type
es 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
width
denotara_codecvt.encoding()
. Siis_open() == false
, ooff != 0 && width <= 0
, entonces la operación de posicionamiento falla. De lo contrario, siway != basic_ios::cur
ooff != 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)
.
fseek
acepta un long
parámetro Si off_type
y streamoff
se definen como long long
(como lo sugiere el estándar), esto podría conducir a una conversión descendente a la long
hora 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 streamoff
tipo en primer lugar.
¿Es esto intencional o un defecto en el estándar?
seekoff
necesariamente se use fseek
debajo del capó. Más bien, el comportamiento (¿presumiblemente familiar?) De fseek
se utiliza para explicar lo que seekoff
está haciendo.
fseek
siempre que haga algo con el mismo efecto. Pero fseek
con un desplazamiento menor LONG_MIN
o mayor que LONG_MAX
no tiene ningún efecto, por lo que la explicación es, en el mejor de los casos, incompleta, al menos para implementaciones donde streamoff
es más amplia que long
.