2014-09-14 3 views
2

Я использую ubuntu 14.04 и пытаюсь читать двоичный файл, но fseek никогда не возвращает -1 из-за размера файла.почему fseek никогда не возвращается -1

Почему это произошло?

#include <stdio.h> 

int main() { 
    const char *fn = "myfile"; 
    FILE * fid; 
    fid = fopen(fn, "r"); 
    int flag; 
    while(1) { 
     flag = fseek(fid, sizeof(float), SEEK_CUR); 
     printf("flag: %d\n",flag); 
     if(flag) 
      break; 
    } 
} 
+2

Почему 'SizeOf float' важно в вашем примере? Во всяком случае, правильно позиционировать курсор чтения * за * конец файла. – usr2564301

+0

Не важно, как я могу узнать, что я превосхожу файл с помощью fseek .. – neouyghur

+0

У вас нет, поскольку это не то, что проверяет 'fseek'. – usr2564301

ответ

3

Короткая Причина: поиск в положение, которое превышает размер файла не рассматриваются как ошибка в fseek.

В следующих разделах приведены из man 3 fseek:

ВОЗВРАТ СТОИМОСТИ

rewind() функция не возвращает никакого значения. После успешного завершения fgetpos(), fseek(), fsetpos() возвращение 0 и ftell() возвращает текущее смещение. В противном случае возвращается -1, а errno устанавливается для указания ошибки.

ОШИБКА

EBADF Поток указано не доступный для поиска потока.
EINVAL Значение аргумента fseek() не было SEEK_SET, SEEK_END, или SEEK_CUR. Или: результирующее смещение файла будет отрицательным.

Что означает:

// This is not an error 
int ret_0 = fseek(file, 1, SEEK_END); 
assert(ret_0 == 0); 
// While this is an error 
int ret_1 = fseek(file, -1, SEEK_SET); 
assert(ret_1 == -1); 
+0

Во втором примере ferror не установлен. Есть ли разница между ошибкой и неудачным исполнением? –

+0

@ IvanIvanov В моем тесте 2-й пример установил 'errno' 22, который является' EINVAL' – starrify

+0

Спасибо, и как я могу узнать, что я был конце файла или превысил конец файла в двоичном файле .. – neouyghur

Смежные вопросы