这是我的代码。
if(fseek(file,position,SEEK_SET)!=0)
{
throw std::runtime_error("can't seek to specified position");
}
我曾经假设即使position
大于文件中的字符数,此代码也可以正常工作(即抛出错误),但事实并非如此。所以我想知道在试图寻找文件范围之外时如何处理寻找失败?
好吧,您总是可以在执行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);
}
请注意,这不是线程安全的。
根据man
: http: //linuxmanpages.com/man3/fseek.3.php,fseek
在出错的情况下返回非零值,唯一可能出现的错误是:
EBADF 指定的流不是可查找的流。
EINVAL fseek() 的whence 参数不是SEEK_SET、SEEK_END 或SEEK_CUR。
超出文件结尾可能被认为不是lseek
. feof
但是,紧随其后的调用可能表明文件外的情况。
if( fseek(file,position,SEEK_SET)!=0 || ftell(file) != position )
{
throw std::runtime_error("can't seek to specified position");
}
越过文件末尾不是错误。如果您写入该偏移量,该文件将扩展为空字节。