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

如何计算数组大小为10的文本与二进制文件数组之和?附错误代码求助

修正文件数组求和代码的问题

我来帮你梳理代码里的关键问题,再给出能实现需求的修正版本~

先说说你代码里的核心错误

  • 文件打开模式错了:你打开二进制文件用了wb(写二进制)模式,但你是要读取这个文件,得用rb(读二进制)模式;而且所有文件打开后都要检查是否成功,不然文件不存在时会触发空指针错误。
  • 文本文件读取方式不对:fread是用来读二进制数据的,你的文本文件是空格分隔的整数,得用fscanf来读取文本格式的数值。
  • 循环里的fscanf用法完全错了:既没传入要读取的文件指针,也没传对变量的地址(应该是&arr_in[i]),还重复调用了两次,会错误跳过大量数据。
  • 打印时数组越界:循环结束后i的值是10,此时访问sum[i]已经超出数组范围了;而且你需要打印所有求和后的元素,不是单个越界值。
  • 没关闭文件:操作完文件后一定要用fclose关闭,避免资源泄漏。

修正后的完整代码

#include <stdio.h>
#define ARR_SIZ 10

int main() {
    int arr_in[ARR_SIZ];
    int arr_bin[ARR_SIZ];
    int i = 0;

    // 打开文本文件,检查是否成功打开
    FILE *fp_in = fopen("data/in.txt", "r");
    if (fp_in == NULL) {
        printf("无法打开文本文件 data/in.txt\n");
        return 1;
    }

    // 打开二进制文件,使用读模式rb,检查是否成功打开
    FILE *fp_bin = fopen("data/in.bin", "rb");
    if (fp_bin == NULL) {
        printf("无法打开二进制文件 data/in.bin\n");
        fclose(fp_in); // 先关闭已打开的文本文件
        return 1;
    }

    // 读取文本文件中的整数
    for (i = 0; i < ARR_SIZ; i++) {
        fscanf(fp_in, "%d", &arr_in[i]);
    }

    // 读取二进制文件中的整数,同时检查读取数量
    size_t read_count = fread(arr_bin, sizeof(int), ARR_SIZ, fp_bin);
    if (read_count != ARR_SIZ) {
        printf("二进制文件读取不完全,仅读取了 %zu 个元素\n", read_count);
    }

    // 计算两个数组的对应元素和
    int sum[ARR_SIZ];
    for (i = 0; i < ARR_SIZ; i++) {
        sum[i] = arr_in[i] + arr_bin[i];
    }

    // 打印所有求和结果
    printf("两个数组的求和结果:\n");
    for (i = 0; i < ARR_SIZ; i++) {
        printf("%d ", sum[i]);
    }
    printf("\n");

    // 关闭所有打开的文件
    fclose(fp_in);
    fclose(fp_bin);

    return 0;
}

补充说明

  • 文本文件data/in.txt的内容是3 2 1 3 4 5 6 1 2 3,用fscanf循环读取每个整数到数组是正确的方式。
  • 二进制文件data/in.bin里的数组{1,2,3,4,5,6,7,8,9,10},需要是用二进制方式写入的(比如之前用fwrite写入的int数组),这样fread才能正确解析。
  • 代码里增加了文件打开失败的判断和读取数量检查,让程序更健壮,不会因为文件问题直接崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:27:47