问题与fseek

时间:2011-02-17 10:56:29

标签: c++ c file fseek

这是我的代码。

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

我曾经认为,即使position大于文件中的字符数,这段代码也能正常工作(即抛出错误),但事实并非如此。所以我想知道在尝试寻找文件范围时如何处理寻找失败?

4 个答案:

答案 0 :(得分: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);
}

请注意,这不是线程安全的。

答案 1 :(得分:0)

根据manhttp://linuxmanpages.com/man3/fseek.3.phpfseek会在出现错误时返回非零值,并且唯一可能出现的错误是:

  

EBADF指定的流不是可搜索的流   EINVAL fseek()的whence参数不是SEEK_SET,SEEK_END或SEEK_CUR。

超出文件结尾可能被认为不是lseek的错误。但是,紧跟其后调用feof可能表示存在文件外的情况。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

搜索文件末尾并不是错误。如果写入该偏移量,则文件将使用空字节进行扩展。