C ++は、streamoff
タイプを使用して(ファイル)ストリーム内のオフセットを表し、[stream.types]で次のように定義されます。
using streamoff = implementation-defined ;
タイプstreamoffは、オペレーティングシステムの最大可能ファイルサイズを表すのに十分なサイズの、署名された基本的な整数型の1つの同義語です。287)
287)通常は長いです。
これは、(long
32ビット幅しかない可能性があるを使用するのとは対照的に)大きなファイル内をシークできるため、理にかなっています。
[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_type
streamoff
はと同等です。[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)
。
fseek
long
パラメータを受け入れます。off_type
とstreamoff
定義されている場合long long
(標準で推奨されているとおり)、これはlong
呼び出し時にへのダウンコンバージョンにfseek(file, width * off, whence)
つながる可能性があります(バグの診断が困難になる可能性があります)。これはstreamoff
、そもそも型を導入する根拠全体に疑問を投げかけます。
これは意図的なものですか、それとも規格の欠陥ですか?
seekoff
必ずしもフードの下で使用 fseek
するようには見えません。むしろ、(おそらくおなじみ?)の動作は、fseek
何seekoff
をしているのかを説明するために使用されます。
fseek
、同じ効果を持つ何かを実行する限り、実際に呼び出す必要がないことを意味すると合理的に解釈できることに同意します。ただしfseek
、オフセットが以下LONG_MIN
またはそれ以上の場合LONG_MAX
は効果がないため、少なくともがより大きい実装でstreamoff
は、説明はせいぜい不完全ですlong
。