C ++ verwendet den streamoff
Typ, um einen Offset innerhalb eines (Datei-) Streams darzustellen, und ist in [stream.types] wie folgt definiert:
using streamoff = implementation-defined ;
Der Typ Streamoff ist ein Synonym für einen der vorzeichenbehafteten integralen Grundtypen mit ausreichender Größe, um die maximal mögliche Dateigröße für das Betriebssystem darzustellen. 287)
287) Typischerweise lang lang.
Dies ist sinnvoll, da damit große Dateien gesucht werden können (im Gegensatz zur Verwendung long
, die möglicherweise nur 32 Bit breit ist).
[filebuf.virtuals] definiert basic_filebuf
die Funktion zum Suchen in einer Datei wie folgt:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_type
ist äquivalent zu streamoff
, siehe [iostreams.limits.pos]. Der Standard erklärt dann jedoch die Auswirkungen der Funktion. Ich bin irritiert über den allerletzten Satz, für den ein Anruf erforderlich ist fseek
:
Effekte :
width
Bezeichnena_codecvt.encoding()
. Wennis_open() == false
oderoff != 0 && width <= 0
, schlägt der Positionierungsvorgang fehl. Wenn andernfallsway != basic_ios::cur
oderoff != 0
, und wenn die letzte Operation ausgegeben wurde, aktualisieren Sie die Ausgabesequenz und schreiben Sie eine beliebige Verschiebungssequenz. Suchen Sie als nächstes die neue Position: ifwidth > 0
, callfseek(file, width * off, whence)
, andernfalls callfseek(file, 0, whence)
.
fseek
akzeptiert einen long
Parameter. Wenn off_type
und streamoff
definiert sind als long long
(wie vom Standard vorgeschlagen), kann dies zu einer Abwärtskonvertierung auf long
beim Anruf führen fseek(file, width * off, whence)
(was zu möglicherweise schwer zu diagnostizierenden Fehlern führt). Dies stellt die gesamte Begründung für die Einführung des streamoff
Typs in Frage .
Ist dies beabsichtigt oder ein Fehler in der Norm?
seekoff
unbedingt Anwendungen fseek
unter der Motorhaube. Vielmehr wird das (vermutlich vertraute?) Verhalten von fseek
verwendet, um zu erklären, was zu seekoff
tun ist.
fseek
werden muss, solange er etwas mit demselben Effekt tut. Da jedoch fseek
ein Versatz kleiner LONG_MIN
oder größer als LONG_MAX
keine Auswirkung hat, ist die Erklärung bestenfalls unvollständig, zumindest für Implementierungen, bei denen der streamoff
Abstand breiter als ist long
.