C语言如何将文本和二进制文件的数值存入数组并实现对比
现有代码问题
- 类型不匹配:
buffer定义为char类型数组,无法存储字符串指针或整数值,要存储数值应当定义整数类型数组 - 读取逻辑错误:循环仅执行1次,只能读取1次文件内容,无法逐行读取所有数值
- 缺少类型转换:
fgets读取到的是字符串格式的数值,需要转换为整型才能进行后续对比 - 缺少文件打开校验:如果文件读取失败会直接触发空指针访问崩溃
- 未实现二进制文件读取和对比逻辑
实现思路
- 逐行读取文本文件内容,将每行的字符串数值转换为整型后存入数组,同时记录文本数值的总个数
- 读取二进制文件中的整型数值,默认二进制文件存储的是和文本文件数值同类型的连续32位整型数据,如果你实际二进制存储格式不同可对应调整读取逻辑
- 对比两组数值统计重复个数,数据量较大时可以先对文本数组排序后用二分查找优化查询效率
完整实现代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 假设文本文件最多存储10万个数值,可根据实际情况调整 #define MAX_TEXT_NUM 100000 // 排序用的比较函数,配合qsort和bsearch使用 int cmp_int(const void *a, const void *b) { return (*(int *)a - *(int *)b); } int main() { int text_nums[MAX_TEXT_NUM] = {0}; int text_cnt = 0; char line_buf[128] = {0}; // 1. 读取文本文件 FILE *fp_text = fopen("txt100000.txt", "r"); if (fp_text == NULL) { perror("打开文本文件失败"); return -1; } // 逐行读取转换为整数 while (fgets(line_buf, sizeof(line_buf), fp_text) != NULL && text_cnt < MAX_TEXT_NUM) { // 去掉fgets读取到的末尾换行符 line_buf[strcspn(line_buf, "\n")] = '\0'; // 字符串转整数存入数组 text_nums[text_cnt++] = atoi(line_buf); } fclose(fp_text); if (text_cnt == 0) { printf("文本文件中无有效数值\n"); return -1; } // 对文本数组排序,后续用二分查找提高对比效率 qsort(text_nums, text_cnt, sizeof(int), cmp_int); // 2. 读取二进制文件并对比统计 int same_cnt = 0; int bin_num = 0; // 替换为你实际的二进制文件路径 FILE *fp_bin = fopen("target.bin", "rb"); if (fp_bin == NULL) { perror("打开二进制文件失败"); return -1; } // 每次读取一个整型数值 while (fread(&bin_num, sizeof(int), 1, fp_bin) == 1) { // 二分查找是否在文本数组中存在 if (bsearch(&bin_num, text_nums, text_cnt, sizeof(int), cmp_int) != NULL) { same_cnt++; } } fclose(fp_bin); printf("两个文件中相同数值的数量为:%d\n", same_cnt); return 0; }
注意事项
- 如果你的二进制文件存储的不是32位int类型,需要对应修改
bin_num的类型以及fread的读取大小参数 - 如果文本文件数值超过
int的取值范围,可以替换为long或int64_t等更大的整型类型 - 如果你不需要处理大数量级的数值,也可以直接双重循环遍历对比,无需排序和二分查找
内容的提问来源于stack exchange,提问作者Jack Savage
相关产品推荐
相关产品推荐

