fread为空(0kb)文件的行为

ana*_*hab 2 c file fread

以下是在读取空文件时给出分段错误的示例代码.

#include <stdio.h>

main()
{
    FILE *fp;
    int i = 0;
    char buffer[20];

    printf("1\n");
    fp = fopen("/home/amadhab/aa", "r+");
    printf("2\n");
    i = fread(buffer, 1, 1, fp);
    printf("3\n");
    printf("i = %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)

给o/p一个

1
2
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

确实fread()无法读取空(0KB)文件?

Die*_*Epp 6

如果程序有效,应该怎么做:

1
2
3
i = 0

fread()出现故障时,应该(比所要求的数量的项目或一些更小)返回0.但是,这不会发生.这可能是因为fpnull.您不能将null参数传递给fread().可能fp是null因为/home/amadhab/aa不存在.尝试使用它来打开文件:

#include <assert.h>

fp = fopen("/home/amadhab/aa", "r+");
assert(fp != NULL);
Run Code Online (Sandbox Code Playgroud)

或者,了解更多信息,

#include <err.h>

const char *fname = "/home/amadhab/aa";
fp = fopen(fname, "r+");
if (!fp)
    err(1, "%s", fname)
Run Code Online (Sandbox Code Playgroud)

请注意,该err()函数是BSD扩展,但如果需要考虑可移植性,则可以使用strerror()perror()在其他系统上使用.

标准

从n1516第7.21.8.1节:

fread函数从指向的流中读取指向的数组ptr,直到nmemb指定大小的元素.sizestream

请注意,NULL它不指向流,因此通过传递NULL您违反了该fread()函数的前提条件.这在7.1.4节中明确说明:

如果[library]函数的参数具有无效值(例如[...]空指针[...])[...],则行为未定义.