C ++ verwendet den streamoffTyp, 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_filebufdie 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_typeist ä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 :
widthBezeichnena_codecvt.encoding(). Wennis_open() == falseoderoff != 0 && width <= 0, schlägt der Positionierungsvorgang fehl. Wenn andernfallsway != basic_ios::curoderoff != 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).
fseekakzeptiert einen longParameter. Wenn off_typeund streamoffdefiniert sind als long long(wie vom Standard vorgeschlagen), kann dies zu einer Abwärtskonvertierung auf longbeim 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 streamoffTyps in Frage .
Ist dies beabsichtigt oder ein Fehler in der Norm?
seekoffunbedingt Anwendungen fseek unter der Motorhaube. Vielmehr wird das (vermutlich vertraute?) Verhalten von fseekverwendet, um zu erklären, was zu seekofftun ist.
fseekwerden muss, solange er etwas mit demselben Effekt tut. Da jedoch fseekein Versatz kleiner LONG_MINoder größer als LONG_MAXkeine Auswirkung hat, ist die Erklärung bestenfalls unvollständig, zumindest für Implementierungen, bei denen der streamoffAbstand breiter als ist long.