C ++は、streamoffタイプを使用して(ファイル)ストリーム内のオフセットを表し、[stream.types]で次のように定義されます。
using streamoff = implementation-defined ;タイプstreamoffは、オペレーティングシステムの最大可能ファイルサイズを表すのに十分なサイズの、署名された基本的な整数型の1つの同義語です。287)
287)通常は長いです。
これは、(long32ビット幅しかない可能性があるを使用するのとは対照的に)大きなファイル内をシークできるため、理にかなっています。
[filebuf.virtuals]はbasic_filebuf、ファイル内でシークする関数を次のように定義します。
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_typestreamoffはと同等です。[iostreams.limits.pos]を参照してください。ただし、標準は、関数の効果を説明し続けます。私は最後の文にイライラしていますfseek。
効果:レッツを
width示しますa_codecvt.encoding()。is_open() == false、またはの場合、off != 0 && width <= 0位置決め操作は失敗します。それ以外の場合、way != basic_ios::curまたはoff != 0、および最後の操作が出力された場合は、出力シーケンスを更新し、シフト解除シーケンスを書き込みます。次は、新しい位置をシーク:場合はwidth > 0、呼び出しfseek(file, width * off, whence)、そうでない場合は呼び出しますfseek(file, 0, whence)。
fseeklongパラメータを受け入れます。off_typeとstreamoff定義されている場合long long(標準で推奨されているとおり)、これはlong呼び出し時にへのダウンコンバージョンにfseek(file, width * off, whence)つながる可能性があります(バグの診断が困難になる可能性があります)。これはstreamoff、そもそも型を導入する根拠全体に疑問を投げかけます。
これは意図的なものですか、それとも規格の欠陥ですか?
seekoff必ずしもフードの下で使用 fseekするようには見えません。むしろ、(おそらくおなじみ?)の動作は、fseek何seekoffをしているのかを説明するために使用されます。
fseek、同じ効果を持つ何かを実行する限り、実際に呼び出す必要がないことを意味すると合理的に解釈できることに同意します。ただしfseek、オフセットが以下LONG_MINまたはそれ以上の場合LONG_MAXは効果がないため、少なくともがより大きい実装でstreamoffは、説明はせいぜい不完全ですlong。