C ++ utilizza il streamoff
tipo 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_filebuf
la 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 :
width
denotaa_codecvt.encoding()
. Seis_open() == false
, ooff != 0 && width <= 0
, l'operazione di posizionamento non riesce. Altrimenti, seway != basic_ios::cur
ooff != 0
e 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)
.
fseek
accetta un long
parametro Se off_type
e streamoff
sono definiti come long long
(come suggerito dalla norma), ciò potrebbe comportare una conversione verso il basso long
durante 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 streamoff
tipo.
Questo è intenzionale o un difetto nello standard?
seekoff
necessariamente usare fseek
sotto il cofano. Piuttosto, il comportamento (presumibilmente familiare?) Di fseek
viene usato per spiegare cosa seekoff
sta facendo.
fseek
finché fa qualcosa con lo stesso effetto. Ma fseek
con un offset minore LONG_MIN
o maggiore di LONG_MAX
non ha alcun effetto, quindi la spiegazione è nella migliore delle ipotesi incompleta, almeno per le implementazioni in cui streamoff
è più ampio di long
.