fread()返回零字节阅读:我不明白为什么

时间:2011-12-12 23:11:28

标签: c file-io std fread fseek

我查看了手册页,并在线阅读了几个例子。我的所有其他系统和标准调用似乎都在处理相同的数据,为什么不在fread?

#include <stdlib.h>
#include <stdio.h>

unsigned char *data;

int main(int argc, char *argv[])
{
    FILE *fp = fopen("test_out.raw", "rb");
    if (fp == NULL) {
        fprintf(stderr, "ERROR: cannot open test_out.raw.\n");
        return -1;
    }

    long int size;
    fseek(fp, 0L, SEEK_END);
    size = ftell(fp);
    if(size < 0) {
        fprintf(stderr, "ERROR: cannot calculate size of file.\n");
        return -1;
    }

    data = (unsigned char *)calloc(sizeof(unsigned char), size);
    if (data == NULL) {
        fprintf(stderr, "ERROR: cannot create data.\n");
        return -1;
    }

    if (!fread(data, sizeof(unsigned char), size, fp)) {
        fprintf(stderr, "ERROR: could not read data into buffer.\n");
        return -1;
    }

    int i;
    for (i = 0 ; i < size; ++i) {
        if (i && (i%10) == 0) putchar('\n');
        fprintf(stdout, " --%c-- ", (unsigned char)(data[i]));
    }

    free(data);
    fclose(fp);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您使用fseek移动到文件的末尾,然后您尝试从中读取它 - 但是,由于您已经在文件的末尾,因此读取失败,因为没有任何内容可供使用读取。

在尝试阅读之前,请使用另一个fseek

返回文件的开头
fseek(fp, 0L, SEEK_SET);

或更简单,使用rewind

rewind(fp);

答案 1 :(得分:1)

您正在调用fseek来查找文件的末尾,这会将位置指示器移动到文件的末尾,因此当您调用fread时,没有数据可供读取。在尝试从中读取数据之前,您需要使用fseek返回文件的开头。