C语言代码始终输出error,调试无果请求问题排查
问题分析与修复
你的代码始终输出"error"的核心原因是文件打开的判断逻辑完全写反了,另外还有几个潜在问题需要修正:
1. 文件打开的判断逻辑错误
fopen函数在成功打开文件时返回非空指针,失败时返回NULL。但你的代码里写的是:
fp = fopen("grades.txt", "r"); if (fp) // 这里逻辑完全颠倒:文件打开成功反而输出error退出 { printf("error"); return 0; }
正确逻辑应该是文件打开失败时才输出错误并退出,要判断指针是否为NULL:
fp = fopen("grades.txt", "r"); if (!fp) // 等价于 if (fp == NULL) { printf("error opening grades.txt\n"); return 1; // 用非0值表示程序异常退出更规范 }
同理,fwrite的打开判断也要做同样修改,而且注意不要用标准库函数名作为变量名——fwrite是C标准库的写文件函数,用作FILE指针变量名会导致编译冲突,建议改成fp_write这类名字。
2. 其他潜在问题
feof的错误使用:while (!feof(fp))会导致最后一次循环重复读取(feof是在读取失败后才会置位),正确做法是用fscanf的返回值判断读取是否成功,比如:while (fscanf(fp, "%s", name) == 1) { // 后续读取逻辑 }- 缓冲区溢出风险:
char name[10];如果读取的字符串长度超过9(加上终止符'\0')会溢出,建议限制输入长度:fscanf(fp, "%9s", name) - 变量名拼写错误:
avarge应该是average,虽不影响运行,但会降低代码可读性
修复后的完整代码示例
#include <stdio.h> int main() { char name[10]; int number_cores = 0, grade = 0; float average = 0.0, sum = 0.0; FILE* fp = NULL; FILE *fp_write = NULL; int i; fp = fopen("grades.txt", "r"); if (!fp) { printf("error opening grades.txt\n"); return 1; } fp_write = fopen("averages.txt", "w"); if (!fp_write) { printf("error opening averages.txt\n"); fclose(fp); // 打开失败时要关闭已打开的文件 return 1; } // 用fscanf返回值判断读取是否成功,替代feof while (fscanf(fp, "%9s", name) == 1) { fprintf(fp_write,"%s:", name); if (fscanf(fp,"%d", &number_cores) != 1) { break; // 读取失败则退出循环 } sum = 0; for (i = 0; i < number_cores; i++) { if (fscanf(fp, "%d", &grade) != 1) { break; } sum += grade; } average = (sum / number_cores); fprintf(fp_write, "%f\n", average); } fclose(fp_write); fclose(fp); return 0; }
内容的提问来源于stack exchange,提问作者Efrat
相关产品推荐
相关产品推荐

