Проблема с fseek - PullRequest
       5

Проблема с fseek

2 голосов
/ 17 февраля 2011

Вот мой код.

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

Раньше я предполагал, что даже если position больше чем num символов в файле, этот код будет работать правильно (то есть, ошибка выбрасывания), но это не так. Итак, я хочу знать, как я могу справиться с ошибкой поиска при попытке поиска вне диапазона файлов?

Ответы [ 4 ]

2 голосов
/ 17 февраля 2011

Ну, вы всегда можете проверить длину файла перед выполнением 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);
}

Имейте в виду, что это не потокобезопасно.

0 голосов
/ 17 февраля 2011

Это не ошибка поиска за концом файла.Если вы запишете с этим смещением, файл будет расширен нулевыми байтами.

0 голосов
/ 17 февраля 2011
if( fseek(file,position,SEEK_SET)!=0 || ftell(file) != position )
{
  throw std::runtime_error("can't seek to specified position");
}
0 голосов
/ 17 февраля 2011

Согласно man: http://linuxmanpages.com/man3/fseek.3.php, fseek возвращает ненулевое значение в случае ошибки, и могут появляться только следующие ошибки:

EBADF Потокуказанный поток не является доступным для поиска.
EINVAL Аргументом wherece для fseek () не было SEEK_SET, SEEK_END или SEEK_CUR.

Выход за пределы конца файла, вероятно, не считается ошибкойдля lseek.Тем не менее, вызов feof сразу после может указывать на состояние вне файла.

...