⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compare.cpp

📁 两个文本文件的比较 并把两个文本的变更找出来
💻 CPP
字号:
#include<iostream>
#include<string>
#include<stdlib.h>
#include"fstream"
using namespace std;
struct txt
{
	int value;
	string str;
};
const int NUM=100;   //待比较文本的段落的最大数目
string getpara(ifstream &fp,char &ch,int &nnn)
{
	nnn=0;
	while (ch=='\n'||ch=='\r') ch=fp.get();
	string ss;
	char st[100];
	int j=0;
	while (ch!='\n'&&ch!='#'&&ch!='\r')
	{
		st[j]=ch;
		j++;
		nnn=nnn+ch;//算出该段所有字符的ASCII码值的和,以便在比较过程中节省时间
		ch=fp.get();	
	}
	st[j]='\0';
	ss=st;
	return ss;
}
int main(int argc,char *argv[])
{
	if (argc!=4)
	{
		cout<<"命令名错误!或缺少参数!"<<endl;
		return 1;
	}
	ifstream in1(argv[1],ios::in|ios::binary);
	if (!in1)
	{
		cout<<"cannot open the input.txt!\n";
		return 1;
	}
	ifstream in2(argv[2],ios::in|ios::binary);
	if (!in2)
	{
		cout<<"cannot open the input.txt!\n";
		return 1;
	}
	fstream result(argv[3],ios::out);
	if (!result)
	{
		cout<<"cannot open the file output!\n";
		return 1;
	}
	txt source[NUM];
	txt target[NUM];
	char ch=in1.get();
	int nn=0,m,n,nnn,i,j;
	while (ch!='#')//两个待比较文本均要以#结束
	{	
		nnn=0;
		source[nn].str=getpara(in1,ch,nnn);
        source[nn].value=nnn;
		nn++;
	}
	m=nn;
	ch=in2.get();
	nn=0;
	while (ch!='#')//两个待比较文本均要以#结束
	{	
		nnn=0;
		target[nn].str=getpara(in2,ch,nnn);
        target[nn].value=nnn;
		nn++;
	}
	n=nn;
	bool f;
	int com[NUM];
	for (j=0;j<n;j++)
	{
		i=0;f=false;
		while(i<m&&f==false)
		{
			if (source[i].value==target[j].value)
			{
				if (source[i].str==target[j].str)
				{
					result<<"目标文件第"<<j+1<<"段为源文件第"<<i+1<<"段"<<endl;
					com[j]=i;
					f=true;
				}
				else i++;
			}
			else i++;
		}
		if (f==false) 
		{
			result<<"目标文件第"<<j+1<<"段为新增段"<<endl;
			com[j]=NUM;
		}
	}
	int t,x,w,y;
	i=0;j=0;
	while (j<n)
	{
		while (com[j]==i&&j<n)
		{
			i++;j++;
		}
		if (j==n) result<<"比较结束!"<<endl;
		else if (com[j]==NUM)
		{
			t=0;
			while (com[j]==NUM&&j<n)
			{
				t++;j++;
			}
			if (j==n) result<<"源文件从第"<<i+1<<"段开始,在目标文件中完全被"<<t<<"个新文件所代替!比较结束!"<<endl;
			if (j<n)
			{
				if (i==com[j]) result<<"源文件的第"<<i<<"段与第"<<com[j]+1<<"段之间在目标文件中添加了"<<t<<"个新段落!"<<endl;
				else
				{
					y=j+1;
					while (com[y]!=i&&y<n) y++;
					if (y==n) 
					{
						result<<"源文件中的第"<<i+1<<"段在目标文件中被删除!并在此添加了"<<t<<"个新增段!"<<endl;
						i++;
					}
					else
					{
						result<<"源文件从第"<<i<<"段开始到第"<<i+1<<"段之间在目标文件中依次插入了以下几段:"<<endl;
						for (w=j;w<y;w++)
						{
							if (com[j]==NUM) result<<"一个新段落"<<endl;
							else result<<"源文件中的第"<<com[j]+1<<"段"<<endl;
							j++;
						}
					}
				}
			}
		}
		else if (com[j]!=NUM)
		{
			x=j+1;
			while (com[x]!=i&&x<n) x++;
			if (x==n) 
			{
				result<<"源文件中的第"<<i+1<<"段在目标文件中被删除!"<<endl;
				i++;
			}
			else
			{
				result<<"源文件从第"<<i<<"段开始到第"<<i+1<<"段之间在目标文件中依次插入了以下几段:"<<endl;
				for (w=j;w<x;w++)
				{
					if (com[j]==NUM) result<<"一个新段落"<<endl;
					else result<<"源文件中的第"<<com[j]+1<<"段"<<endl;
					j++;
				}
			}
		}
	}
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -