使用fread功能:要读取的大小大于可读取的大小

时间:2012-05-22 15:28:35

标签: c fread file-pointer

我有一个问题:

我正在使用fread来阅读文件。

typedef struct {
    int ID1;
    int ID2;
    char string[256];
} Reg;

Reg *A = (Reg*) malloc(sizeof(Reg)*size);

size = FILESIZE/sizeof(Reg);

fread (A, sizeof(Reg), size, FILEREAD);

使用循环,连续调用此调用,让我读取整个文件。

当我接近文件的末尾会发生什么,我无法读取“size”* sizeof(Reg),或者如果你只能读取这个数量的一半,那么我的数组A会发生什么。它会完成吗?该函数将返回错误?

了解fread如何读取文件?

Edi1:确切地说,如果除法不精确的话,当我读到最后一点较小的文件大小时,我将读取未存档的内容,我想知道我的向量调整大小为我的字节数可以阅读,或发展更好的动态。

2 个答案:

答案 0 :(得分:8)

fread返回它读取的记录数。缓冲区之外的任何内容都可能被破坏,不依赖于该数据。

  

fread返回实际读取的完整项目数,可能是   如果发生错误或文件结尾,则小于计数   在达到计数之前遇到过。

该函数不会读取超过文件末尾的内容:最有可能的情况是,您将获得一堆完整缓冲区,然后读取(最终)部分缓冲区,除非文件大小是缓冲区的精确倍数长度。

您的逻辑需要适应这一点 - 文件大小为您提供了预期的记录总数,因此不应该忽略缓冲区中的尾随数据(在最终fread调用之后)与未初始化的记录相对应。 “剩余阅读记录”计数器将是一种方法。

答案 1 :(得分:1)

fread()返回它可以读取的元素数。因此,您必须检查fread()的返回值,以确定数组中有多少元素有效。

如果发生错误或达到EOF,它将返回短项目计数或零。在这种情况下,您必须使用feof() ond ferror()来检查满足的条件。