【问题标题】:fread returns zerofread 返回零
【发布时间】:2010-07-28 22:06:30
【问题描述】:

我有一个函数可以将 rom 文件读入内存并自动分配以适应该文件,但每次我尝试从文件描述符中读取时,fread() 都会返回零。我不确定我做错了什么。有人可以帮忙吗?

int read_rom(const char *filename, unsigned char ***rom) {
    int rom_size;
    FILE *fd = NULL;

    if((fd = fopen(filename, "r")) != NULL) {
        fseek(fd, 0, SEEK_END);
        rom_size = ftell(fd);
        (*rom) = malloc(rom_size);
        int read = fread(rom, 1, rom_size, fd);
        fclose(fd);

        printf("read: %d\n", read);

        return rom_size;
    }

    return -1;
}

int main(int argc, char **argv) {
    unsigned char rom_size = 0;
    unsigned char **rom = NULL;
    rom_size = read_rom(argv[1], &rom);

    return 1;
}

有接受者吗?

【问题讨论】:

  • fread 返回零时,您可以使用feofferror 来调查原因。

标签: c file file-io


【解决方案1】:

您没有读取任何内容,因为您 fseeked 到了文件的末尾。执行fseek(fd, 0, SEEK_SET); 以返回到fread 之前的文件开头。

【讨论】:

  • 或者 rewind() 如果你愿意 - 注意缺少的 'f'
  • 天哪,我忘了 rewind() ......我一定是瞎了。非常感谢您指出这一点。
【解决方案2】:

如果 fread 返回零,则文件结束发生错误。

返回值

fread() 和 fwrite() 返回成功读取的项目数 或者 书面(即,不是字符数)。如果发生错误, 或者 到达文件结尾,返回值是一个短项目计数 (或者 零)。

fread() 不区分文件结尾和错误,并且 来电者 必须使用 feof(3) 和 ferror(3) 来确定发生了什么。

我建议您检查文件是否有错误,如果发生错误,您应该打印相关的错误信息以获取更多信息!这应该是您当前调试的一部分,也是作为错误处理的已完成代码的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多