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

关于fgets函数读取行为与man手册描述不符的技术疑问

关于fgets函数的理解误区:为什么size=2时输出与预期不符?

man手册对fgets的描述是正确的,问题出在你对循环执行逻辑的误解上:

fgets()从stream中读取最多size-1个字符并存储到s指向的缓冲区,读取在EOF或换行符后停止。若读取到换行符,将其存入缓冲区,最后在缓冲区末尾添加终止空字节('\0')。

你编写的代码中,fgets(s,2,fp)每次调用确实只会读取最多1个字符(size-1=2-1=1),但循环会持续调用fgets直到文件结束:

  • 第一次调用读取字符t,存入s后printf输出t
  • 第二次调用读取下一个字符h,覆盖s后printf输出h
  • 第三次调用读取i,输出i
  • ……以此类推,直到把文件中所有字符(包括换行符)逐个读取并输出,最终自然会打印出完整的文件内容。

你的预期输出错误地假设循环只会执行5次(每行一次),但实际上fgets不会跳过未读取的字符,循环会执行与文件总字符数相等的次数。

如果想直观看到每次fgets的读取结果,可以修改printf语句,每次输出后换行:

while(fgets(s,2,fp)!=NULL)  printf("%s\n",s);

此时输出会是每个字符单独一行(包括换行符),就能清晰看到fgets每次确实只读取了1个字符,完全符合man手册的描述。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:50:25