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

基于文件读取的C语言While循环逻辑报错及文件操作异常问题

问题诊断与修复方案

已知错误列表

  • 函数嵌套定义违反C语言标准:seqsum函数定义在main函数内部,且未正确闭合函数体,导致seqsum return后的文件打开代码完全无法执行,输入文件从未被正确打开
  • 文件读取逻辑错误:使用fgetc读取单个字符而非整数,无法正确识别负数、多位数,且将字符ASCII码当做数值处理,逻辑完全偏离预期
  • 循环逻辑错误:循环条件内两次调用fgetc会导致每次循环丢弃一个字符,且||逻辑会导致读到EOF后仍尝试读取,出现死循环或未定义行为
  • 资源释放与作用域错误:outFile在else分支内部定义,分支外无法访问,调用fclose(outFile)属于非法操作;else分支执行return前未关闭文件,缓冲区数据未刷新写入磁盘,导致输出文件不生成/无内容
  • 分支判断逻辑错误:错误使用putchar的返回值判断整数大小,putchar是字符输出函数,返回值和输入的整数值无关联

修正后可运行代码

#include <stdio.h>

// 求和函数移到main外,符合C标准
int seqsum(int start, int end) {
    int sum = 0;
    while (start <= end)
        sum += start++;
    return sum;
}

int main(){
    int x; // 存储读取的整数,使用int类型
    FILE *inFile = fopen("input.txt","r");
    // 增加文件打开失败判断,避免异常崩溃
    if (inFile == NULL) {
        printf("无法打开input.txt\n");
        return 1;
    }
    FILE *outFile = NULL;
    // 循环读取整数,直到读取失败或遇到大于0的整数
    while (fscanf(inFile, "%d", &x) == 1) {
        if (x <= 0) {
            printf("%d is not greater than zero\n", x);
        } else {
            int sum = seqsum(0, x);
            printf("The sum of the numbers 0 to %d is: %d\n", x, sum);
            outFile = fopen("output.txt", "w");
            if (outFile != NULL) {
                fprintf(outFile,"The sum of the numbers 0 to %d is: %d\n", x, sum);
                fclose(outFile); // 写入完成立即关闭文件,刷新缓冲区到磁盘
            }
            break; // 终止循环,避免直接return导致输入文件未关闭
        }
    }
    fclose(inFile);
    return 0;
}

运行效果说明

代码会按预期依次处理input.txt内的数值:

  1. 读到0、-1、-3时依次在命令行打印对应非正提示
  2. 读到第一个正数4时,打印0到4的累加和10,同时写入output.txt后结束程序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:24:01