C语言使用fgets读取txt文件内容仅输出部分字符串是什么原因
问题解答
核心错误原因
你的代码问题出在fgets(buffer, sizeof(buffer), fp)这一行对sizeof运算符的误用:buffer是char*类型的指针变量,不是字符数组,sizeof(buffer)计算的是指针本身占用的内存大小,而非你用malloc申请的100字节缓冲区的总容量。
问题1:为什么无法打印完整的字符串?
- fgets函数的第二个参数指定了最多读取的字节数(包含末尾的字符串终止符
\0),实际最多会读取参数值-1个有效字符。 - 64位系统下指针类型的大小固定为8字节,你传入
sizeof(buffer)相当于告诉fgets最多读8字节,所以最多只能拿到7个有效字符,远小于文件里的整句长度,自然无法打印完整内容。 - 如果你是在32位系统下运行,指针大小为4字节,甚至只能读到3个有效字符。
问题2:为什么输出的是长度为7的"This sp"?
你的words.txt第一行的前7个有效字符依次为T h i s (空格)s p,正好凑够fgets能读取的7个有效字符上限,fgets读完后会在缓冲区第8位自动写入\0作为字符串终止标记,printf遇到\0就会停止输出,所以最终结果就是"This sp"。
代码修正方案
把fgets调用的第二个参数改为你实际申请的缓冲区大小即可:
// 把原来的fgets行替换成下面的 fgets(buffer, 100, fp);
如果要保留sizeof写法,可以把缓冲区定义为栈上的字符数组,此时sizeof计算的就是数组总容量:
char buffer[100] = {0}; // 数组定义,不需要malloc/free fgets(buffer, sizeof(buffer), fp);
额外建议:调用fopen后要判断返回值是否为NULL,避免文件不存在/权限不足时程序崩溃。
内容的提问来源于stack exchange,提问作者y J.
相关产品推荐
相关产品推荐

