有时候很多基于文件的外部排序算法都需要合并两个有序的文件。下面就给出简单的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;;
}
}
}
else
while (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路归并的算法要做一些记录性的处理。在后面的博客中给出。
分享到:
相关推荐
分割和合并文件,程序节选自《Visual C++ 程序开发范例宝典》。知识点INI文件的读写、文件的创建、文件的读写。
异或推介会这个小程序是一个对两个二进制文件进行异或运算的工具。 如果文件的大小不同,将使用较小的大小。用法xor file1 [file2] 例子:合并随机种子 xor random-seed-1 random-seed-2 > mixed-rnd-seed一次性密码...
>比较合并两个文件 >在文件比较窗口中直接编辑文件 >当文件内容改变时文件比较窗口自动更新比较结果 >在文件比较窗口中查找/替换 >查找上一个/下一个不同的文本块 >将所有相同/不同的行拷贝到剪贴...
>比较合并两个文件 >在文件比较窗口中直接编辑文件 >当文件内容改变时文件比较窗口自动更新比较结果 >在文件比较窗口中查找/替换 >查找上一个/下一个不同的文本块 >将所有相同/不同的行拷贝到剪贴板。通过这个功能,...
合并两个链表 C++ 牛客网 删除单向链表的节点 C++ Leetcode 链表中的倒数第k个节点 go&&C++ 牛客网 二叉树镜像 C++ 牛客网 链表的反转 C++ 牛客网 树的子结构 C++ 牛客网 二叉树的后序遍历 C++ Leetcode 旋转图像 ...
这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! 如题。详细见源码。 GMem 内存管理单元源码。GMem.cpp...
1.11 检查一个字符串是文本还是二进制 23 1.12 控制大小写 25 1.13 访问子字符串 26 1.14 改变多行文本字符串的缩进 29 1.15 扩展和压缩制表符 31 1.16 替换字符串中的子串 33 1.17 替换字符串中的子串-Python...
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
} 4 运行结果 实验二 运算符的重载和文件流 1 实验内容 建立一个二进制文件,用来存放自然数1~20及其平方根,然后输入1~20之内的任意一 个自然数,查找出其平方根显示在屏幕上。 2 实验准备和说明 创建c++文件 3 ...
VSS通过将有关项目文档(包括文本文件、图象文件、二进制文件、声音文件、视屏文件)存入数据库进行项目研发管理工作。用户可以根据需要随时快速有效地共享文件。文件一旦被添加进VSS,它的每次改动都会被记录下来,...
VSS通过将有关项目文档(包括文本文件、图象文件、二进制文件、声音文件、视屏文件)存入数据库进行项目研发管理工作。用户可以根据需要随时快速有效地共享文件。文件一旦被添加进VSS,它的每次改动都会被记录下来,...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
1.5.6. 输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数 ....... 116 1.5.7. 输入一个表示整数的字符串,把该字符串转换成整数并输出.............. 118 1.5.8. 给出一个数列,找出其中最长的单调...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
显示了从DBF类型的二进制文件中提取具有任意内存访问权限(MMF)的字符串数据块,并在两个时间缓冲区之一中对这些信息进行排序的可能性。 优化排序速度和已用内存量。