2

これが私のコードです。

if(fseek(file,position,SEEK_SET)!=0)
{
  throw std::runtime_error("can't seek to specified position");
}

positionがファイル内の文字数よりも大きい場合でも、このコードは正しく機能する (つまり、エラーをスローする)と想定していましたが、そうではありませんでした。ファイル範囲外をシークしようとしたときに、シークの失敗をどのように処理できるか知りたいですか?

4

4 に答える 4

2

ファイルの長さは、実行する前にいつでも確認できますfseek

void safe_seek(FILE* f, off_t offset) {
    fseek(f, 0, SEEK_END);
    off_t file_length = ftell(f);
    if (file_length < offset) {
        // throw!
    }
    fseek(f, offset, SEEK_SET);
}

ただし、これはスレッドセーフではないことに注意してください。

于 2011-02-17T11:05:16.953 に答える
0

によると:http man//linuxmanpages.com/man3/fseek.3.phpは、fseekエラーの場合にゼロ以外の値を返し、表示される可能性のあるエラーは次のとおりです。

EBADF指定されたストリームはシーク可能なストリームではありません。
EINVAL fseek()のwhence引数は、SEEK_SET、SEEK_END、またはSEEK_CURではありませんでした。

ファイルの終わりを超えた場合は、おそらくエラーではないと見なされますlseekfeofただし、直後に呼び出すと、ファイル切れの状態が示される場合があります。

于 2011-02-17T11:14:40.480 に答える
0

ファイルの終わりを超えてシークすることはエラーではありません。そのオフセットに書き込むと、ファイルはnullバイトで拡張されます。

于 2011-02-17T11:55:43.313 に答える
0
if( fseek(file,position,SEEK_SET)!=0 || ftell(file) != position )
{
  throw std::runtime_error("can't seek to specified position");
}
于 2011-02-17T11:18:53.150 に答える