C ++ utilizza il streamofftipo per rappresentare un offset all'interno di un flusso (file) ed è definito come segue in [stream.types]:
using streamoff = implementation-defined ;Il tipo streamoff è sinonimo di uno dei tipi integrali di base firmati di dimensioni sufficienti per rappresentare la dimensione massima del file possibile per il sistema operativo. 287)
287) Tipicamente lungo lungo.
Questo ha senso perché consente di cercare all'interno di file di grandi dimensioni (anziché utilizzare long, che può essere largo solo 32 bit).
[filebuf.virtuals] definisce basic_filebufla funzione di ricerca all'interno di un file come segue:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_typeè equivalente a streamoff, vedi [iostreams.limits.pos]. Tuttavia, lo standard prosegue spiegando gli effetti della funzione. Sono irritato dall'ultima frase, che richiede una chiamata a fseek:
Effetti :
widthdenotaa_codecvt.encoding(). Seis_open() == false, ooff != 0 && width <= 0, l'operazione di posizionamento non riesce. Altrimenti, seway != basic_ios::curooff != 0e se è stata emessa l'ultima operazione, aggiornare la sequenza di emissione e scrivere qualsiasi sequenza non spostata. Quindi, cerca la nuova posizione: ifwidth > 0, callfseek(file, width * off, whence), altrimenti callfseek(file, 0, whence).
fseekaccetta un longparametro Se off_typee streamoffsono definiti come long long(come suggerito dalla norma), ciò potrebbe comportare una conversione verso il basso longdurante la chiamata fseek(file, width * off, whence)(portando a bug potenzialmente difficili da diagnosticare). Ciò mette in discussione l'intera logica alla base dell'introduzione del streamofftipo.
Questo è intenzionale o un difetto nello standard?
seekoffnecessariamente usare fseek sotto il cofano. Piuttosto, il comportamento (presumibilmente familiare?) Di fseekviene usato per spiegare cosa seekoffsta facendo.
fseekfinché fa qualcosa con lo stesso effetto. Ma fseekcon un offset minore LONG_MINo maggiore di LONG_MAXnon ha alcun effetto, quindi la spiegazione è nella migliore delle ipotesi incompleta, almeno per le implementazioni in cui streamoffè più ampio di long.