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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:36:04