问题: fread不会读出EOF

由于文件读写较慢,为加快程序速度,采用一定缓冲区分批读入文件。 本来是以EOF为循环跳出条件,可是竟陷入了死循环。
输出读到的内容,从文件中读入这样一句话,果然是没有EOF的。
好奇为何会这样,我打开了fread函数的源码,发现它的实现是这样的:
实现方法

- 如果文件流已缓冲且存在字符,则读入(最多或所有)字符
- 如果文件缓冲区没有字符,则处理EOF或fail。对于EOF的处理方法为:读取EOF并返回数目,不将EOF加入读取buf中。这也就是fopen读取内容没有EOF的原因。
- 如果流没有缓冲区,或者流缓冲区已满,没有足够的空间进行直接读取,所以使用特殊函数进行读取
解决方案:
根据返回的int值:实际读到的元素数和最大读入大小比较,判断是否文件结束。
int n=fread(buf, 1, BUFSIZE, fp);
if (n < BUFSIZE)
buf[n] = EOF;
本文探讨了在使用fread函数批量读取文件时遇到的EOF问题,解析了fread源码中关于EOF处理的细节,并提供了如何通过比较实际读取数判断文件结束的解决方案。

3324

被折叠的 条评论
为什么被折叠?



