使用 fread 函数:要读取的大小大于可供读取的大小
-
13-12-2019 - |
题
我有个问题:
我正在使用 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 是如何读取文件的吗?
埃迪1:确切地说,如果划分不准确,当我读取最后一点较小的文件大小时,我将读取文件中没有的内容,我想知道将矢量大小调整为我可以读取或开发的字节数动态更好。
解决方案
fread 返回它读取的记录数。在缓冲区中的任何内容都可能会被播放,不依赖于该数据。
fread返回实际读取的完整项目的数量,这可能是 小于计数是否发生错误或者文件的末尾是 在达到计数之前遇到。
功能不会读取文件的末尾:最可能发生的是,您将获得一堆完整的缓冲区,然后是(最终)部分缓冲区读取,除非文件大小是缓冲区的完全倍数长度。
您的逻辑需要容纳此项 - 文件大小为您提供了预期的记录总数,因此不应忽略与未初始化的记录对应的缓冲区中的尾随数据(在最终的fread
呼叫之后)。留下读数柜台的“记录”是一种方法。
其他提示
fread()
返回它可以读取的元素数。所以你必须检查返回值 fread()
找出数组中有多少元素是有效的。
如果发生错误或发生错误,它将返回一个短项目计数或零 EOF
已经达到了。你将不得不使用 feof()
另一 ferror()
在这种情况下检查满足什么条件。
不隶属于 StackOverflow