如何计算数组大小为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
相关产品推荐
相关产品推荐

