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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:30:55