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

C语言读取init.txt文件仅获一半内容,请求代码排查

解决C语言读取init.txt文件内容不完整的问题

我帮你拆解下代码里的几个关键问题,这些都可能导致你只能读到一半内容:

问题1:fscanf后残留的换行符干扰fgets

你用fscanf(fp,"%d\n%d,%d", ...)读取初始数值后,文件指针的位置可能停留在换行符或其他空白字符上。第一个fgets执行时会先读取这个空行,相当于浪费了一次读取机会,导致后面实际内容少读了一行。

问题2:缓冲区长度计算可能不足

你设置的temp[i]缓冲区大小是forest->width*2+1,如果init.txt里每行的实际字符数(包括换行符)超过这个值,fgets会截断当前行,剩下的内容会被下一次fgets读取,把原本的一行拆成多行,看起来就像内容“断成了一半”。

问题3:打印范围不匹配读取次数

你读取了forest->height行,但打印时固定循环10次:如果forest->height小于10,会打印未初始化的垃圾内容;如果forest->height大于10,只打印前10行,自然看起来像是没读完所有内容。

修正后的代码示例

FILE *fp; 
// 建议根据实际需求调整数组大小,或用动态分配更灵活
char temp[10][256]; 
int i;

if((fp=fopen("init.txt","r"))==NULL) { 
    printf("Reading Error!!"); 
    // 这里最好加return/exit,避免后续代码执行
    return 1;
}

// 读取初始数值,去掉格式串里的\n,改用手动跳过换行
fscanf(fp,"%d,%d,%d", &botanist->water_bootle_size, &forest->height, &forest->width);
printf("%d %d %d ",botanist->water_bootle_size, forest->height, forest->width);

// 跳过fscanf后残留的换行符和空白
int c;
while ((c = fgetc(fp)) != '\n' && c != EOF);

// 按实际height循环读取
for(i=0;i<forest->height;i++) { 
    // 用足够大的缓冲区,也可根据实际行长调整
    fgets(temp[i], sizeof(temp[i]), fp); 
}

// 只打印实际读取的行数
for(i=0;i<forest->height;i++) { 
    printf("%s",temp[i]); 
}

fclose(fp);

额外建议

  • 每次调用fgets后最好检查返回值,判断是否读取成功或到达文件末尾:if(fgets(temp[i], sizeof(temp[i]), fp) == NULL) break;
  • 如果文件里的行长度不确定,建议用动态内存分配(比如malloc)创建缓冲区,避免截断问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:31:29