为什么fseek永远不会返回-1

时间:2014-09-14 12:16:00

标签: c linux file fseek

我正在使用ubuntu 14.04并尝试读取二进制文件,但是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;
    }
}

1 个答案:

答案 0 :(得分:3)

原因很简单:在fseek中,寻找超出文件大小的位置不被视为错误。

以下部分引自man 3 fseek

  

返回值

     

rewind()函数不返回任何值。成功完成后,fgetpos()fseek()fsetpos()返回0ftell()返回当前偏移量。否则,返回-1并设置errno以指示错误。

     

错误

     

EBADF指定的流不是可搜索的流   EINVAL fseek()的whence参数不是SEEK_SETSEEK_ENDSEEK_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);