基于文件读取的C语言While循环逻辑报错及文件操作异常问题
问题诊断与修复方案
已知错误列表
- 函数嵌套定义违反C语言标准:
seqsum函数定义在main函数内部,且未正确闭合函数体,导致seqsumreturn后的文件打开代码完全无法执行,输入文件从未被正确打开 - 文件读取逻辑错误:使用
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内的数值:
- 读到0、-1、-3时依次在命令行打印对应非正提示
- 读到第一个正数4时,打印0到4的累加和10,同时写入
output.txt后结束程序
内容的提问来源于stack exchange,提问作者walkam
相关产品推荐
相关产品推荐

