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

