`
java-mans
  • 浏览: 11710348 次
文章分类
社区版块
存档分类
最新评论

C++合并两个有序的二进制文件

 
阅读更多

有时候很多基于文件的外部排序算法都需要合并两个有序的文件。下面就给出简单的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路归并的算法要做一些记录性的处理。在后面的博客中给出。

分享到:
评论

相关推荐

    二进制文件的合并

    本文将深入探讨如何使用C++语言将一个二进制文件的内容合并到具有相同结构的另一个二进制文件中。首先,我们需要理解二进制文件的基本概念。 二进制文件(Binary File)是一种非文本文件,它存储的是机器可直接理解...

    二进制文件合并工具

    二进制文件合并工具则是用于整合两个或多个二进制文件的软件应用,这种工具在特定的开发、调试或数据处理场景中非常有用。下面我们将详细探讨二进制文件合并的相关知识点。 1. **二进制文件的结构**:二进制文件的...

    两个bin文件合并成1个bin文件UBIN.zip

    在IT行业中,我们经常需要处理各种类型的二进制文件,如BIN文件。BIN文件是一种包含原始数据的二进制文件,通常用于存储程序、设备固件或者数据。在某些应用场景下,例如嵌入式系统开发或者固件更新,可能需要将多个...

    如何将keil5中的bin文件合并

    当需要将多个二进制文件合并成一个单一的文件时,这通常是为了创建一个包含固件更新或者多个功能模块的完整系统映像。以下是对标题和描述中所述知识点的详细说明: 1. **Keil μVision5**:这是由ARM公司开发的IDE...

    二进制哈弗曼编码C++程序

    每次取出频率最小的两个节点合并为一个新的节点,新节点的频率是两个子节点频率之和,将新节点入队。 - 重复此过程直到只剩下一个节点,这个节点就是哈弗曼树的根节点。 2. **哈弗曼编码生成**: - 从根节点出发...

    能在windows上将多个.bin文件合并成一个文件。是用QT写的工具

    是用QT写的工具”表明这是一个使用QT框架开发的软件应用,其主要功能是合并多个.bin格式的二进制文件。QT是一个跨平台的C++应用程序开发框架,它提供了丰富的图形用户界面(GUI)功能和系统接口,使得开发者能够方便...

    c++ PCM合并,并转换为WAV

    本文将深入探讨如何使用C++语言合并两个PCM文件,并将合并后的PCM数据转换成WAV文件。这一过程涉及到音频数据的读取、处理以及文件格式的转换。 PCM是一种无损音频编码方式,它将模拟音频信号通过采样、量化和编码...

    XOR:二进制文件上的小异或工具

    异或推介会这个小程序是一个对两个二进制文件进行异或运算的工具。 如果文件的大小不同,将使用较小的大小。用法xor file1 [file2] 例子:合并随机种子 xor random-seed-1 random-seed-2 &gt; mixed-rnd-seed一次性密码...

    qt将多个bin文件合成一个bin文件

    在标题"qt将多个bin文件合成一个bin文件"中,提到的操作是将多个二进制(bin)文件合并成一个单一的bin文件。这种技术通常用于简化软件分发、提高效率或优化资源管理。 在描述中,"QT发布工具文件夹是可以使用的exe...

    VC++ 文件分割与合并

    在合并文件时,这个过程相反,我们需要按照保存在INI文件中的顺序和大小信息,逐个读取分割文件,然后写入目标文件。 为了确保文件分割与合并的正确性,我们还需要处理一些细节问题。比如,保持文件的元数据(如...

    UltraCompare二进制比较工具

    1. 文件比较:UltraCompare 支持文本文件、二进制文件以及图像文件的比对,可以轻松检测到一行内甚至一个字节的差异。 2. 文件夹比较:除了单个文件,UltraCompare 还能对比整个文件夹及其子文件夹的内容,这对于...

    16进制与float互转

    4. 合并并转换:将符号、指数和尾数合并为一个32位的二进制数,然后转换为16进制。 五、编程实现 在编程语言中,如Python,我们可以直接使用内建函数进行16进制与float的转换: ```python # 16进制转float hex_str ...

    c++计算一个文件的16位效验和

    // 将两个字节合并为16位 unsigned short data = (static_cast(byte1) ) | static_cast(byte2); // 更新效验和 checksum += data; } ``` 4. **处理进位**:如果效验和超过16位的最大值,需要进行进位操作。这...

    Ziff:一个简单的二进制差异工具

    - 差异合并:允许用户合并两个二进制文件的差异,生成一个新的文件。 - 压缩效率:由于齐夫是开源的,开发者可以根据需要优化算法,提高比较速度或减少内存使用。 总之,齐夫(Ziff)作为一款基于C++的二进制差异工具...

    把ASCII码转为十六进制数值

    每个ASCII字符都由一个7位二进制数表示,可以转换为十进制或十六进制形式。在给定的场景中,我们需要将ASCII码字符串转换为十六进制数值。 首先,我们需要理解ASCII码的基本概念。ASCII码定义了128个不同的字符,...

    MD5 C++实现 对文件计算MD5值

    这个函数接受两个参数:`pMd5`是一个字符数组,用于存储计算得到的MD5值;`pFileName`是待处理文件的路径。函数返回一个布尔值,表示计算MD5值是否成功。 在C++中实现MD5,通常需要以下步骤: 1. **包含必要的库**...

    哈夫曼压缩与解压算法(可以直接运行)

    在实际操作中,这个过程可以通过动态规划的方式实现,确保每次合并两个权值最小的节点,直到只剩下一个节点,即为哈夫曼树的根。 生成哈夫曼编码后,将原始数据按照编码进行替换,得到一串二进制序列,这就是压缩后...

    Huffman编码C++实现

    编码表通常以文本形式保存,而二进制数据则可以直接写入二进制文件。在读取时,先读取编码表,然后读取二进制数据进行解码。 在提供的压缩包文件"**Huffman**"中,很可能包含了实现以上步骤的C++源代码。代码可能...

    名企(华为_阿卡_TCL_索尼_微软_百度_大唐)笔试面试题(C居多含C++及数据结构)

    4. 算法设计:使用链表实现将两个有序队列 A 和 B 合并到有序队列 H 中,并解决一群人围成一圈,报 3 者出列的问题。 5. 数据结构:链表的应用、数组的操作、指针的使用都是重要的数据结构知识点。 6. 编程语言:C++...

    文件压缩程序(基于哈夫曼C++算法)

    这些算法在处理文本文件时效果良好,但在处理二进制文件(如图片和视频)时,可能不如哈夫曼编码有效。 在实际应用中,通常会结合多种压缩算法,如ZIP和RAR文件格式,它们内部使用了多种压缩方法以适应不同类型的...

Global site tag (gtag.js) - Google Analytics