C语言读取masks.txt文本文件的程序编译后无法读入数据,求问题排查
C语言文件读取问题修复方案
核心错误点
- 读写对象混淆:你已经通过
fopen打开了masks.txt得到文件指针fp,但代码中所有读取操作仍然用scanf、fgets从标准输入(键盘)读,根本没有从目标文件读取数据,这是读不出内容的核心原因。需要把scanf替换为fscanf(fp, ...),删除不必要的fgets(buffer, BUFFERSIZE, stdin)调用。 - 变量读取语法错误:
scanf("%d", withMasks)、scanf("%d", totalPeople)两处都没有给变量加取地址符&,会导致内存访问错误,程序直接崩溃。 - 整数除法截断问题:
withMasks和totalPeople都是整型变量,直接做除法会默认按整数运算截断小数部分,需要先强制转浮点型再计算比例。 - 格式化输出语法错误:
printf("Number of days: ", n)、printf("day #", days, ":\t\t")都缺少格式化占位符,无法正确输出变量值,需要补%d。 - 最高/最低值判断逻辑错误:
else (percentage < lowest);写法不符合语法,后面的分号会导致判断逻辑失效,lowest和highest的判断逻辑顺序错误,无法正确统计全局最值。 feof用法不规范:while(!feof(fp))会在文件末尾多执行一次循环,建议直接用fscanf的返回值判断是否读取成功。
修正后完整代码
#include <stdio.h> #include <limits.h> #define BUFFERSIZE 100 int main(int argc, char *argv[]) { FILE *fp; fp = fopen("masks.txt", "r"); if (fp == NULL) { printf("Error. File not found!\n"); return (-1); } int n, count = 0, days = 1; float sum = 0, total = 0, min = INT_MAX, max = INT_MIN; float lowest = INT_MAX, highest = INT_MIN; // 从文件读取天数n fscanf(fp, "%d", &n); printf("Project #4\n"); printf("Number of days: %d", n); printf("\n\n"); printf("\t\t t1\t t2\t t3\t t4\t t5\t Aver\t Min\t Max\n"); printf("\t\t-----\t-----\t-----\t-----\t-----\t-----\t-----\t-----\n"); int withMasks, totalPeople; // 直接用fscanf返回值判断是否读完 while (fscanf(fp, "%d %d", &withMasks, &totalPeople) == 2) { if (count % 5 == 0) { printf("day #%d:\t\t", days); days++; } // 强制转浮点避免整数截断 float percentage = ((float)withMasks / totalPeople) * 100; // 修正单日最值判断 if (percentage > max) { max = percentage; } if (percentage < min) { min = percentage; } // 修正全局最值判断 if (percentage > highest) { highest = percentage; } if (percentage < lowest) { lowest = percentage; } sum += percentage; printf("%0.1f%%\t", percentage); count++; if (count % 5 == 0) { printf("%0.1f%%\t", (sum / 5)); printf("%0.1f%%\t", min); printf("%0.1f%%\t", max); total += (sum / 5); sum = 0; min = INT_MAX, max = INT_MIN; printf("\n"); } } printf("\n\nOverall average: %0.1f%%", (total / n)); printf("\nLowest overall: %0.1f%%", lowest); printf("\nHighest overall: %0.1f%%", highest); fclose(fp); return 0; }
内容的提问来源于stack exchange,提问作者qral
相关产品推荐
相关产品推荐

