3

我有个问题:

我正在使用 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 through 读取的吗?

Edi1:确切地说,如果划分不准确,当我读取最后一个较小的文件大小时,我会读取文件中没有的内容,我想知道我的向量调整大小为我可以读取的字节数,或者发展动态更好。

4

2 回答 2

8

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

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

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

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

于 2012-05-22T15:30:33.740 回答
1

fread()返回它可以读取的元素数。所以你必须检查返回值fread()来找出你的数组中有多少元素是有效的。

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

于 2012-05-22T15:33:25.343 回答