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

问题描述 投票:3回答:2

我有个问题:

我正在使用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:确切地说,如果除法不精确,当我读到最后一点较小的文件大小时,我将读取未存档的内容,我想知道我的向量调整大小到我可以读取的字节数,或者发展更好的动态。

c fread file-pointer
2个回答
8
投票

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

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

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

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.