我正在使用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;
}
}
答案 0 :(得分:3)
原因很简单:在fseek
中,寻找超出文件大小的位置不被视为错误。
以下部分引自man 3 fseek
:
返回值
rewind()
函数不返回任何值。成功完成后,fgetpos()
,fseek()
,fsetpos()
返回0
,ftell()
返回当前偏移量。否则,返回-1
并设置errno以指示错误。错误
EBADF
指定的流不是可搜索的流EINVAL
fseek()
的whence参数不是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);