关于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
相关产品推荐
相关产品推荐

