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

如何将两个有序文件中的数字合并为升序的第三个文件?代码问题排查

问题分析与修复

你的合并逻辑存在核心错误:主循环中重复读取文件元素,导致大量数据被跳过。

错误原因

主循环 while(fs1 >> n1 && fs2 >> n2) 会在每次循环开始时,从两个文件各读取一个元素。但在分支判断后,你又额外执行了一次 fs1 >> n1 或 fs2 >> n2,这就导致每次循环实际消耗了两个元素(一个被写入,一个被跳过)。比如处理input1的1后,立刻读取了2,而下一次循环又会读取3,直接跳过了2的写入,最终只保留了奇数位的元素。

修复后的代码

void merge(string input_file1, string input_file2, string output_file){
    fstream fs1; 
    fstream fs2; 
    fstream fs3;
    int n1, n2;  
    fs1.open(input_file1); 
    fs2.open(input_file2);
    fs3.open(output_file); 

    // 先读取两个文件的第一个元素,初始化循环条件
    bool has_n1 = (fs1 >> n1);
    bool has_n2 = (fs2 >> n2);

    while(has_n1 && has_n2){
        if(n1 < n2){
            fs3 << n1 << " ";
            has_n1 = (fs1 >> n1); // 只读取下一个n1
        }
        else{
            fs3 << n2 << " "; 
            has_n2 = (fs2 >> n2); // 只读取下一个n2
        }
    }
    // 处理剩余元素
    while(has_n1){
        fs3 << n1 << " ";
        has_n1 = (fs1 >> n1);
    }
    
    while(has_n2){
        fs3 << n2 << " ";
        has_n2 = (fs2 >> n2);
    }
}

修复说明

  1. 先单独读取两个文件的第一个元素,用布尔变量标记是否读取成功,避免循环开始时重复读取。
  2. 主循环中,每次只写入当前比较的元素,然后仅读取对应文件的下一个元素,确保每个元素都被处理。
  3. 剩余元素的处理也基于布尔标记,确保最后一个未写入的元素也被输出。

用你的测试输入运行修复后的代码,输出结果会是正确的:1 2 3 4 5 6 7 34 56 77 78 88 90 100

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:40:54