ferror() 的返回值不是错误号;它为零表示没有错误,非零表示错误。如果您想知道错误号,请查看errno。最好显示完整的代码,包括对来自fseek() 的返回值的测试等等。
我无法在我的 Mac 上重现您的问题。我创建了一个与您的大小相同的大文件:
$ ls -l big.file
-rw-r--r-- 1 jleffler staff 53394002 Oct 5 19:57 big.file
$
代码
#include <stdio.h>
int main(int argc, char **argv)
{
const char *filename = "big.file";
if (argc > 1)
filename = argv[1];
FILE *f = fopen(filename, "r");
if (f == 0)
{
perror(filename);
return 1;
}
if (fseek(f, 0, SEEK_END) != 0)
perror("fseek END 1");
printf("EOF %ld\n", ftell(f));
if (fseek(f, -1024, SEEK_END) != 0)
perror("fseek END 2");
printf("POS %ld\n", ftell(f));
char buf[1024];
size_t n = fread(buf, 1, 1024, f); // OP reports returns 0.
printf("N = %zu\n", n);
int r = ferror(f); // OP reports returns 3.
printf("r = %d\n", r);
printf("POS %ld\n", ftell(f));
if (fseek(f, 0, SEEK_END) != 0)
perror("fseek END 3");
printf("POS %ld\n", ftell(f));
fclose(f);
return 0;
}
这不是很好的代码:它不会在检测错误时放弃(perror() 打印后返回);它不显示读取的数据,因此可以将其与文件中的内容进行比较(使用随机数据生成器生成,然后使用 GNU truncate 截断为文件的精确长度)
编译运行
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror bf19.c -o bf19
$ ./bf19
EOF 53394002
POS 53392978
N = 1024
r = 0
POS 53394002
POS 53394002
$
这表明该代码可以在我的运行 macOS Sierra 10.12 和 GCC 6.2.0 的 Mac 上运行。因此,您的问题在于您未显示的代码。调整您的代码,以便它可以编译和运行,并显示一个最小的测试用例,比如这个重现问题的测试用例。有关如何操作的指导,请阅读: