C ++ utilise le streamofftype pour représenter un décalage dans un flux (de fichier) et est défini comme suit dans [stream.types]:
using streamoff = implementation-defined ;Le type streamoff est synonyme de l'un des types intégraux de base signés de taille suffisante pour représenter la taille de fichier maximale possible pour le système d'exploitation. 287)
287) Typiquement longue et longue.
Cela a du sens, car il permet de rechercher dans des fichiers volumineux (par opposition à l'utilisation long, qui ne peut avoir qu'une largeur de 32 bits).
[filebuf.virtuals] définit basic_filebufla fonction de rechercher dans un fichier comme suit:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_typeest équivalent à streamoff, voir [iostreams.limits.pos]. Cependant, la norme explique ensuite les effets de la fonction. Je suis irrité par la toute dernière phrase, qui nécessite un appel à fseek:
Effets :
widthnotonsa_codecvt.encoding(). Siis_open() == false, ouoff != 0 && width <= 0, l'opération de positionnement échoue. Sinon, siway != basic_ios::curouoff != 0, et si la dernière opération a été sortie, mettez à jour la séquence de sortie et écrivez toute séquence non décalée. Ensuite, recherchez la nouvelle position: siwidth > 0, appelezfseek(file, width * off, whence), sinon appelezfseek(file, 0, whence).
fseekaccepte un longparamètre. Si off_typeet streamoffsont définis comme long long(comme suggéré par la norme), cela pourrait conduire à une conversion vers le bas longlors de l'appel fseek(file, width * off, whence)(conduisant à des bogues potentiellement difficiles à diagnostiquer). Cela remet en question toute la justification de l'introduction du streamofftype en premier lieu.
Est-ce intentionnel ou un défaut dans la norme?
seekoffnécessairement à des utilisations fseek sous le capot. Le comportement (vraisemblablement familier?) De fseekest plutôt utilisé pour expliquer ce qui seekoffse passe.
fseektant qu'elle fait quelque chose avec le même effet. Mais fseekavec un décalage inférieur LONG_MINou supérieur à LONG_MAXn'a aucun effet, donc l'explication est au mieux incomplète, au moins pour les implémentations où streamoffest plus large que long.