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

重复调用fgets读取文件时第二次调用无输出的原因是什么

问题原因
  • fgets的设计机制决定了它单次最多读取参数指定的缓冲区大小-1个字符,最后一个位置会自动填充字符串结束符\0,你传入的缓冲区大小是30,因此单次最多只能读29个有效字符。
  • 你的第一行内容刚好有30个字符,加上行尾的换行符,整行总长度达到31字节,第一次调用fgets仅读完了前29个字符,既没有读完第一行,也没有触发行尾的换行符,文件指针停在第一行的第30个字符位置。
  • 第二次调用fgets实际读取的是第一行剩余的内容,仅包含1-2个字符(第一行最后1个字符+换行符),很容易误以为没有输出;如果文件第一行末尾没有换行符,第二次读取的内容会是第一行剩余字符拼接第二行前28个字符,也会和你的预期不符。
  • 额外诱因:你的代码没有判断fopen、fgets的返回值,如果文件打开失败、读取到EOF,后续操作都会出现未定义行为,也可能导致无输出。
修复方案
  1. 调大缓冲区容量,至少比单行长多2个字节(预留换行符和结束符的空间),比如将缓冲区大小设为1024,就能保证一次读完整行。
  2. 每次调用IO函数后增加返回值判断:fopen返回NULL说明文件打开失败,fgets返回NULL说明已经读到文件末尾或读取出错,避免无效操作。
  3. 如果必须使用30字节的缓冲区,可以循环调用fgets读取直到遇到换行符或EOF,确认读完一整行后再处理下一行内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:54:03