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

