O C ++ usa o streamoff
tipo para representar um deslocamento em um fluxo (arquivo) e é definido da seguinte maneira em [stream.types]:
using streamoff = implementation-defined ;
O tipo streamoff é sinônimo de um dos tipos integrais básicos assinados de tamanho suficiente para representar o tamanho máximo possível de arquivo para o sistema operacional. 287)
287) Normalmente longo.
Isso faz sentido porque permite procurar em arquivos grandes (em vez de usar long
, que podem ter apenas 32 bits de largura).
[filebuf.virtuals] define basic_filebuf
a função de buscar em um arquivo da seguinte maneira:
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
, consulte [iostreams.limits.pos]. No entanto, o padrão continua a explicar os efeitos da função. Estou irritado com a última frase, que exige uma chamada para fseek
:
Efeitos : Vamos
width
denotara_codecvt.encoding()
. Seis_open() == false
, ouoff != 0 && width <= 0
, a operação de posicionamento falhará. Caso contrário, seway != basic_ios::cur
ouoff != 0
, e se a última operação foi emitida, atualize a sequência de saída e escreva qualquer sequência de não mudança. Em seguida, procure a nova posição: sewidth > 0
, liguefseek(file, width * off, whence)
, caso contrário, liguefseek(file, 0, whence)
.
fseek
aceita um long
parâmetro Se off_type
e streamoff
for definido como long long
(conforme sugerido pelo padrão), isso poderá levar a uma conversão inativa ao long
chamar fseek(file, width * off, whence)
(levando a erros potencialmente difíceis de diagnosticar). Isso põe em questão toda a lógica para introduzir o streamoff
tipo em primeiro lugar.
Isso é intencional ou um defeito no padrão?
seekoff
necessariamente usar fseek
sob o capô. Em vez disso, o comportamento (presumivelmente familiar?) De fseek
é usado para explicar o que seekoff
está fazendo.
fseek
desde que faça algo com o mesmo efeito. Mas fseek
com um deslocamento menor LONG_MIN
ou maior que LONG_MAX
não tem efeito, a explicação é, na melhor das hipóteses, incompleta, pelo menos para implementações onde streamoff
é maior que long
.