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

根据man: http: //linuxmanpages.com/man3/fseek.3.phpfseek在出错的情况下返回非零值,唯一可能出现的错误是:

EBADF 指定的流不是可查找的流。
EINVAL fseek() 的whence 参数不是SEEK_SET、SEEK_END 或SEEK_CUR。

超出文件结尾可能被认为不是lseek. feof但是,紧随其后的调用可能表明文件外的情况。

于 2011-02-17T11:14:40.480 回答
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 回答
0

越过文件末尾不是错误。如果您写入该偏移量,该文件将扩展为空字节。

于 2011-02-17T11:55:43.313 回答