调用fgetc读取文件后再使用fgets无输出是什么原因?
问题原因
- 代码中的第一个
while循环通过不断调用fgetc,已经把整个文件的内容全部读取完毕,此时C语言标准IO的文件指针arq已经定位到了文件的末尾位置,同时文件流的EOF(文件结束)标志位已经被置位。 - 后续调用
fgets时,会首先检测到文件流已经处于结束状态,直接返回NULL,所以第二个while循环的判断条件直接不成立,不会进入循环执行打印逻辑。 - 删除第一个循环后,文件指针还停留在文件起始位置,
fgets可以正常从开头读取内容,因此可以正常打印。
解决方案
如果需要先统计行数再读取文件内容,可选择两种方案:
- 统计完行数后调用
rewind(arq)把文件指针重置到文件起始位置,同时清除文件流的EOF标志位,之后再调用fgets就可以正常读取内容。修改后的代码片段示例:
printf("%d", line_count); rewind(arq); // 新增该行重置文件指针到文件开头 char str[128]; while(fgets(str, 128, arq)) printf("%s", str);
- 也可以先调用
fclose(arq)关闭已读到末尾的文件,再重新调用fopen打开文件,获取指向文件起始位置的新文件指针后再进行读取操作。
额外优化提示
你代码里用char类型存储fgetc的返回值是不规范的:fgetc的返回值类型为int,除了返回读取到的字符外,还会返回EOF(通常是值为-1的宏),如果你的系统中char是无符号类型,那么enter变量永远不可能等于EOF,会导致第一个循环变成死循环,建议把char enter修改为int enter。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

