You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用fgetc读取文件后再使用fgets无输出是什么原因?

问题原因

  • 代码中的第一个while循环通过不断调用fgetc,已经把整个文件的内容全部读取完毕,此时C语言标准IO的文件指针arq已经定位到了文件的末尾位置,同时文件流的EOF(文件结束)标志位已经被置位。
  • 后续调用fgets时,会首先检测到文件流已经处于结束状态,直接返回NULL,所以第二个while循环的判断条件直接不成立,不会进入循环执行打印逻辑。
  • 删除第一个循环后,文件指针还停留在文件起始位置,fgets可以正常从开头读取内容,因此可以正常打印。

解决方案

如果需要先统计行数再读取文件内容,可选择两种方案:

  1. 统计完行数后调用rewind(arq)把文件指针重置到文件起始位置,同时清除文件流的EOF标志位,之后再调用fgets就可以正常读取内容。修改后的代码片段示例:
printf("%d", line_count);
rewind(arq); // 新增该行重置文件指针到文件开头
char str[128];
while(fgets(str, 128, arq)) printf("%s", str);
  1. 也可以先调用fclose(arq)关闭已读到末尾的文件,再重新调用fopen打开文件,获取指向文件起始位置的新文件指针后再进行读取操作。

额外优化提示

你代码里用char类型存储fgetc的返回值是不规范的:fgetc的返回值类型为int,除了返回读取到的字符外,还会返回EOF(通常是值为-1的宏),如果你的系统中char是无符号类型,那么enter变量永远不可能等于EOF,会导致第一个循环变成死循环,建议把char enter修改为int enter。

内容的提问来源于stack exchange,提问作者Jonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:54:03