O C ++ usa o streamofftipo 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_filebufa 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
widthdenotara_codecvt.encoding(). Seis_open() == false, ouoff != 0 && width <= 0, a operação de posicionamento falhará. Caso contrário, seway != basic_ios::curouoff != 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).
fseekaceita um longparâmetro Se off_typee streamofffor definido como long long(conforme sugerido pelo padrão), isso poderá levar a uma conversão inativa ao longchamar 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 streamofftipo em primeiro lugar.
Isso é intencional ou um defeito no padrão?
seekoffnecessariamente usar fseek sob o capô. Em vez disso, o comportamento (presumivelmente familiar?) De fseeké usado para explicar o que seekoffestá fazendo.
fseekdesde que faça algo com o mesmo efeito. Mas fseekcom um deslocamento menor LONG_MINou maior que LONG_MAXnão tem efeito, a explicação é, na melhor das hipóteses, incompleta, pelo menos para implementações onde streamoffé maior que long.