#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include<conio.h>
//#define SQ_SIZE 5000 //一条序列的最大长度
//#define SQ_NUMBER 500
int num(FILE *fp) //扫描文件,确定文件中一共多少个序列
{
char data;
int number=0;
data=getc(fp);
while(data!=EOF)
{
if(data=='>')
number++;
data=getc(fp);
}
return number;
}
void compare(char **p1,char **p2,int number1,int number2,char *filename) //比较两个文件中相同的序列
{
FILE *fp;
int i,j,numb1=0,numb2=0,k;
int length,p,q;
int *np1,*np2;
np1=(int *)malloc(number1*(sizeof(int))); //申请一个一维数组用来存放文件1中序列匹配的信息,=1为匹配过,=0为没有匹配过
np2=(int *)malloc(number2*(sizeof(int))); //申请一个一维数组用来存放文件2中序列匹配的信息,=1为匹配过,=0为没有匹配过
for(i=0;i<number1;i++) //数组np1初始化
*(np1+i)=0;
for(i=0;i<number2;i++) //数组np2初始化
*(np2+i)=0;
if((fp=fopen(filename,"w"))==NULL)
{
printf("存放结果的文件打开失败\n");
exit(0);
}
fprintf(fp,"文件1中一共有%d条序列,文件2中一共有%d条序列,比较结果如下:\n",number1,number2);
for(i=0;i<number1;i++)
{
numb2=0;
for(j=0;j<number2;j++)
{
if(strcmp(*(p1+i),*(p2+j))==0) //直接匹配成功
{
numb2++;
numb1++;
*(np1+i)=1;
*(np2+j)=1;
fprintf(fp,"%d-------------------%d\n",i+1,j+1);
}
else if(strlen(*(p1+i))==strlen(*(p2+j))) //如果没有直接匹配成功,则判断两个字符串长度是否相等,相等则把字符串2反序比较
{
length=strlen(*(p1+i));
for(p=0,q=length-1;p<length&&q>=0;p++,q--) //反序比较
{
if(*(*(p1+i)+p)!=*(*(p2+j)+q))
break;
}
if(p==length)
{
numb2++;
numb1++;
*(np1+i)=1;
*(np2+j)=1;
fprintf(fp,"%d-------------------%d\n",i+1,j+1);
}
}
}
if(numb2!=0)
{
for(k=0;k<strlen(*(p1+i));k++)
if(k%50==0)
fprintf(fp,"\n%c",*(*(p1+i)+k));
else
fprintf(fp,"%c",*(*(p1+i)+k));
fprintf(fp,"\n\n");
}
}
if(numb1==0)
fprintf(fp,"两个文件中没有匹配的项\n");
else
{
fprintf(fp,"\n匹配项共%d个\n",numb1);
fprintf(fp,"\n");
for(i=0;i<number1;i++)
if(*(np1+i)==0)
{
fprintf(fp,"文件1中序列%d没有匹配:\n",i+1);
for(k=0;k<strlen(*(p1+i));k++)
if(k%50==0)
fprintf(fp,"\n%c",*(*(p1+i)+k));
else
fprintf(fp,"%c",*(*(p1+i)+k));
fprintf(fp,"\n\n");
}
for(i=0;i<number2;i++)
if(*(np2+i)==0)
{
fprintf(fp,"文件2中序列%d没有匹配:\n",i+1);
for(k=0;k<strlen(*(p2+i));k++)
if(k%50==0)
fprintf(fp,"\n%c",*(*(p2+i)+k));
else
fprintf(fp,"%c",*(*(p2+i)+k));
fprintf(fp,"\n\n");
}
}
fclose(fp);
free(np1);
free(np2);
}
int main()
{
FILE *fp1,*fp2;
int number1,number2; //存放文件中一共有多少条序列
int numb=0;
char data;
char filename1[50],filename2[50],filename3[50]; //存放文件名
char **p1,**p2;
long index;
char *sq;
int i,j; //循环变量
//-------------------------打开文件--------------------------
printf("输入文件1路径:\n"); //输入文件名1
scanf("%s",filename1);
if((fp1=fopen(filename1,"r"))==NULL) //打开文件
{
printf("文件1打开失败\n");
exit(0);
}
printf("输入文件2路径:\n"); //输入文件名2
scanf("%s",filename2);
if((fp2=fopen(filename2,"r"))==NULL) //打开文件
{
printf("文件2打开失败\n");
exit(0);
}
printf("输入结果文件的路径:\n");
scanf("%s",filename3);
//-------------------确定文件1 和文件2 的序列条数--------------------
number1=num(fp1);
number2=num(fp2);
if(number1==0||number2==0)
{
printf("文件中的格式不正确\n");
exit(0);
}
//--------------------动态申请存放文件1 的空间和存放文件2 的空间-----------------
p1=(char **)malloc(number1*sizeof(char *)); //存放文件1所有序列的指针
p2=(char **)malloc(number2*sizeof(char *)); //存放文件2所有序列的指针
//------------------------------读取文件1-----------------------------------
fseek(fp1,0L,SEEK_SET); //文件1指针回到文件开始地方
clearerr(fp1);
for(j=0;j<number1;j++)
{
numb=0;
while(getc(fp1)!='\n');
index=ftell(fp1); //用index记录当前的指针位置
data=getc(fp1);
while(data!='>'&&data!=EOF) //获取当前一条序列的长度
{
if(data!='\n')
numb++;
data=getc(fp1);
}
sq=(char *)malloc((numb+1)*sizeof(char)); //申请当前一条序列的空间
fseek(fp1,index,SEEK_SET); //把指针定位到序列开始之前的一个位置
numb=0;
data=getc(fp1);
while(data!='>'&&data!=EOF)
{
if(data!='\n')
{
*(sq+numb)=data;
numb++;
}
data=getc(fp1);
}
*(sq+numb)='\0'; //在序列的末尾标记序列的结束
*(p1+j)=sq;
getc(fp1);
}
//------------------------读取文件2--------------------------------
fseek(fp2,0L,SEEK_SET); //文件1指针回到文件开始地方
clearerr(fp2);
for(j=0;j<number2;j++)
{
numb=0;
while(getc(fp2)!='\n');
index=ftell(fp2); //用index记录当前的指针位置
data=getc(fp2);
while(data!='>'&&data!=EOF) //获取当前一条序列的长度
{
if(data!='\n')
numb++;
data=getc(fp2);
}
sq=(char *)malloc((numb+1)*sizeof(char)); //申请当前一条序列的空间
fseek(fp2,index,SEEK_SET); //把指针定位到序列开始之前的一个位置
numb=0;
data=getc(fp2);
while(data!='>'&&data!=EOF)
{
if(data!='\n')
{
*(sq+numb)=data;
numb++;
}
data=getc(fp2);
}
*(sq+numb)='\0'; //在序列的末尾标记序列的结束
*(p2+j)=sq;
getc(fp2);
}
//-------------------------关闭文件-----------------------------
fclose(fp1); //关闭文件1
fclose(fp2); //关闭文件2
//-------------------------比较两个文件-----------------------
compare(p1,p2,number1,number2,filename3);
//-------------------------释放指针-------------------------------
for(i=0;i<number1;i++) //释放文件1中的序列指针
free(*(p1+i));
for(i=0;i<number2;i++) //释放文件2中的序列指针
free(*(p2+i));
free(p1); //释放文件1指针
free(p2); //释放文件2指针
getchar();
getchar();
}
评论0