C++合并两个有序的二进制文件
来源:互联网 发布:java异步记录日志 编辑:程序博客网 时间:2024/06/07 04:58
有时候很多基于文件的外部排序算法都需要合并两个有序的文件。下面就给出简单的C++实现方法。具体思路和合并两个有序的单链表的思路是一样的。
void merge_file(const string& file_in_name1,const string& file_in_name2,const string& file_out_name){//打开两个输入文件和一个输出文件ifstream fin1,fin2;fin1.open(file_in_name1.c_str(),ios::in | ios::binary);fin2.open(file_in_name2.c_str(),ios::in | ios::binary);ofstream fout;fout.open(file_out_name.c_str(),ios::out | ios::binary);//在每个文件中先各读出第一个数int temp1,temp2;fin1.read(reinterpret_cast<char*>(&temp1),sizeof(int));fin2.read(reinterpret_cast<char*>(&temp2),sizeof(int));//在两个文件中前进,每次只选择两个文件中较小的那个数添加到输出文件的末尾while (true){if (temp1<=temp2){fout.write(reinterpret_cast<const char*>(&temp1),sizeof(int));//到文件的最后一个数读完之后,再读一次,保证每个文件中的所有数据都被读到。fin1.read(reinterpret_cast<char*>(&temp1),sizeof(int));if (fin1.eof()){break;}}else{fout.write(reinterpret_cast<const char*>(&temp2),sizeof(int));fin2.read(reinterpret_cast<char*>(&temp2),sizeof(int));if (fin2.eof()){break;}}}if (!fin1.eof()){while (true){//另一个文件已经读完了,说明当前这个文件中最后读到的那个整数还没有被写出,所以要先写出。fout.write(reinterpret_cast<const char*>(&temp1),sizeof(int));fin1.read(reinterpret_cast<char*>(&temp1),sizeof(int));if (fin1.eof()){break;;}}}elsewhile (true){fout.write(reinterpret_cast<const char*>(&temp2),sizeof(int));fin2.read(reinterpret_cast<char*>(&temp2),sizeof(int));if (fin2.eof()){break;}}fin1.close();fin2.close();fout.close();}
int main( void ) {vector<int> a;push_rand(a);sort(a.begin(),a.end());write_data_to_file(a,"data1.txt");print_file("data1.txt");a.clear();push_order(a,100);write_data_to_file(a,"data2.txt");print_file("data2.txt");merge_file("data1.txt","data2.txt","data.txt");print_file("data.txt");return 0;}
main函数中用到了例如push_rand这样的函数,都是自己为了测试而写的,不是很重要。可以比较方便的实现,就不一一列出了。这个函数可以用于二路归并排序文件。K路归并的算法要做一些记录性的处理。在后面的博客中给出。
- C++合并两个有序的二进制文件
- 【C语言】两个有序单链表的合并
- C语言实现:合并两个有序的数组,合并后的数组依然有序
- 两个有序单链表的合并&两个有序数组的合并
- 合并两个有序线性表的元素(C语言版)
- 合并两个有序线性表的元素(C语言版)
- 【C】两个有序链表序列的合并
- 数据结构 链表 合并两个有序的单链表 C语言版
- 有序的合并两个有序链表
- 两个有序单链表的合并
- 合并两个有序的单链表
- 合并两个有序的数组
- 合并两个有序的单链表
- 合并两个有序的单链表
- 合并两个有序的单链表
- 合并两个有序的单链表
- 合并两个有序的单链表
- 合并两个有序的数组
- sort qsort的区别
- JSP中获取路径的方式
- 第四次游戏革命:全息游戏
- C/C++编写CGI程序对于form的处理
- 防止phpddos发包攻击
- C++合并两个有序的二进制文件
- 通过bat脚本来每隔一段时间运行jar包
- Linux 中的 /etc/group 和 /etc/passwd 简介
- C++中extern c的用法
- enum枚举类型的范例
- 故作忸怩地说
- 结构中觅得本质
- HDOJ 2159 FATE
- 分销渠道与客户组不一致