如何将两个有序文件中的数字合并为升序的第三个文件?代码问题排查
问题分析与修复
你的合并逻辑存在核心错误:主循环中重复读取文件元素,导致大量数据被跳过。
错误原因
主循环 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 4 5 6 7 34 56 77 78 88 90 100
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

