我有一个问题:
我正在使用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:确切地说,如果除法不精确的话,当我读到最后一点较小的文件大小时,我将读取未存档的内容,我想知道我的向量调整大小为我的字节数可以阅读,或发展更好的动态。
答案 0 :(得分:8)
fread返回它读取的记录数。缓冲区之外的任何内容都可能被破坏,不依赖于该数据。
fread返回实际读取的完整项目数,可能是 如果发生错误或文件结尾,则小于计数 在达到计数之前遇到过。
该函数不会读取超过文件末尾的内容:最有可能的情况是,您将获得一堆完整缓冲区,然后读取(最终)部分缓冲区,除非文件大小是缓冲区的精确倍数长度。
您的逻辑需要适应这一点 - 文件大小为您提供了预期的记录总数,因此不应该忽略缓冲区中的尾随数据(在最终fread
调用之后)与未初始化的记录相对应。 “剩余阅读记录”计数器将是一种方法。
答案 1 :(得分:1)
fread()
返回它可以读取的元素数。因此,您必须检查fread()
的返回值,以确定数组中有多少元素有效。
如果发生错误或达到EOF
,它将返回短项目计数或零。在这种情况下,您必须使用feof()
ond ferror()
来检查满足的条件。