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

C语言如何将文本和二进制文件的数值存入数组并实现对比

现有代码问题
  • 类型不匹配:buffer定义为char类型数组,无法存储字符串指针或整数值,要存储数值应当定义整数类型数组
  • 读取逻辑错误:循环仅执行1次,只能读取1次文件内容,无法逐行读取所有数值
  • 缺少类型转换:fgets读取到的是字符串格式的数值,需要转换为整型才能进行后续对比
  • 缺少文件打开校验:如果文件读取失败会直接触发空指针访问崩溃
  • 未实现二进制文件读取和对比逻辑
实现思路
  1. 逐行读取文本文件内容,将每行的字符串数值转换为整型后存入数组,同时记录文本数值的总个数
  2. 读取二进制文件中的整型数值,默认二进制文件存储的是和文本文件数值同类型的连续32位整型数据,如果你实际二进制存储格式不同可对应调整读取逻辑
  3. 对比两组数值统计重复个数,数据量较大时可以先对文本数组排序后用二分查找优化查询效率
完整实现代码
#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:36:05