这是我的代码。
if(fseek(file,position,SEEK_SET)!=0)
{
throw std::runtime_error("can't seek to specified position");
}
我曾经认为,即使position
大于文件中的字符数,这段代码也能正常工作(即抛出错误),但事实并非如此。所以我想知道在尝试寻找文件范围时如何处理寻找失败?
答案 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)
根据man
:http://linuxmanpages.com/man3/fseek.3.php,fseek
会在出现错误时返回非零值,并且唯一可能出现的错误是:
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)
搜索文件末尾并不是错误。如果写入该偏移量,则文件将使用空字节进行扩展。