为什么fread有时遇到"Bad file descriptor"?

Mic*_*ine 1 c file stream fread

我是从这样的文件中读取的:

#include <stdio.h>

int main() {
    FILE *fp = fopen("sorted_hits", "r+");

    while(!feof(fp)) {
        int item_read;
        int *buffer = (int *)malloc(sizeof(int));
        item_read = fread(buffer, sizeof(int), 1, fp);
        if(item_read == 0) {
            printf("at file %ld\n", ftell(fp));
            perror("read error:");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个文件很大,我有时会收到"错误的文件描述符"错误."ftell"表示发生错误时文件位置停止.

我不知道为什么它"有时",这是正常的吗?问题出在我的代码或硬盘中吗?怎么办呢?

Chr*_*odd 5

perror打印任何errno作为描述性字符串的内容. errno只要系统调用返回错误,就会将其设置为错误代码.但是,如果系统调用没有失败,errno则不会被修改并继续包含之前包含的内容.现在,如果fread返回0,则表示存在错误或者您到达文件末尾.在后一种情况下,errno未设置并且可能包含之前的任何随机垃圾.

因此,在这种情况下,您获得的"错误文件描述符"消息可能只意味着根本没有错误.您应该检查ferror(fp)是否发生了错误.