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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:45:01