检验文件相似度 源代码.docx
《检验文件相似度 源代码.docx》由会员分享,可在线阅读,更多相关《检验文件相似度 源代码.docx(10页珍藏版)》请在冰豆网上搜索。
检验文件相似度源代码
//xiangsidu.cpp:
Definestheentrypointfortheconsoleapplication.
//
//#include"stdafx.h"
//#include"stdlib.h"
#include
#include
voidformat();//没有参数或参数为“/?
”时的帮助提示
voidxiangsidu();//实现对两个目标文件统计相似度的功能
intread1(char*txt);//从命令行参数输入的文件指针读入文件1的内容
intread2(char*pho);//从命令行参数输入的文件指针读入文件2的内容
voidsave1();//将文章1的统计结果保存到3.txt文本文件中
voidsave2();//将文章2的统计结果保存到4.txt文本文件中
chararticle1[50000];
chararticle2[50000];
charword1[500][20];
charword2[500][20];
intnumber2,number1;
structword
{
chardanci[20];
intnum;
floatbili;
}fword1[100],fword2[100];
/******************************主函数************************************/
voidmain(intargc,char*argv[])
{
intflag1,flag2;
if(argc==1)format();
elseif((argc==2)&&strcmp(argv[1],"/?
")==0)format();
elseif(argc==3)
{
flag1=read1(argv[1]);
flag2=read2(argv[2]);
if(flag1==0||flag2==0)
printf("读取信息失败!
\n");
else
{
xiangsidu();save1();save2();
}
}
elseprintf("\n该程序应该携带2个参数!
\n");
}
voidformat()//没有参数或参数为“/?
”时的帮助提示
{
printf("\n命令格式为:
xingsiduSourceFileTargetFile\n\n");
printf("SourceFile指文章1的文本文件\n");
printf("TargetFile指文章2的文本文件\n");
}
/***************从命令行参数输入的文件指针读入文件1的内容*****************/
intread1(char*txt)
{
FILE*ftxt;
inti,n;
if((ftxt=fopen(txt,"rb"))==NULL)//txt即指向的文本文件1的指针
{
printf("%s文件无法打开!
\n");
return0;
}
printf("\n\n\t\t\t读取文件...\n\n");
for(i=0;!
feof(ftxt);i++)//文件内部指针未到文件尾,执行循环体
article1[i]=fgetc(ftxt);//从ftxt所指文件中读取一个字节信息
n=i-1;
fclose(ftxt);
article1[i]='\n';
printf("\n文章1内容如下:
\n\n");
for(i=0;i{
putchar(article1[i]);
}
return1;
}
/******************从命令行参数输入的文件指针读入文件2的内容*****************/
intread2(char*pho)
{
FILE*fpho;
inti,n;
if((fpho=fopen(pho,"rb"))==NULL)//pho即指向的文本文件2的指针
{
printf("%s文件无法打开!
\n");
return0;
}
printf("\n\n\t\t\t读取文件...\n\n");
for(i=0;!
feof(fpho);i++)//文件内部指针未到文件尾,执行循环体
article2[i]=fgetc(fpho);//从fpho所指文件中读取一个字节信息
n=i-1;
fclose(fpho);
article2[i]='\n';
printf("\n文章2内容如下:
\n\n");
for(i=0;i{
putchar(article2[i]);
}
return1;
}
/**********************对文章1和文章2的相同单词进行统计****************************/
voidxiangsidu()
{
inti=0,j=0,k=0,m=0,flag=1;
for(i=0;article1[i]!
='\0';i++)//二维数组word1[]记录文章1中的所有单词
{
if(article1[i]>=65&&article1[i]<=90)article1[i]=article1[i]+32;
if(article1[i]==39||article1[i]>=97&&article1[i]<=122)
{
word1[j][k]=article1[i];
k++;
}
elseif(article1[i]==''||article1[i]==','||article1[i]=='.')
{
word1[j][k]='\0';
j++;
k=0;
}
}
number1=j;//文章1中所有的单词个数number1
j=0;
for(i=0;article2[i]!
='\0';i++)//二维数组word2[]记录文章2中的所有单词
{
if(article2[i]>=65&&article2[i]<=90)article2[i]=article2[i]+32;
if(article2[i]==39||article2[i]>=97&&article2[i]<=122)
{
word2[j][k]=article2[i];
k++;
}
elseif(article2[i]==''||article2[i]==','||article2[i]=='.')
{
word2[j][k]='\0';
j++;
k=0;
}
}
number2=j;//文章2中所有的单词个数number2
k=0;
strcpy(fword1[0].danci,"!
");
strcpy(fword2[0].danci,"!
");
for(i=0;i{
flag=1;
for(j=0;j{
if(strcmp(word1[i],word2[j])==0)
{
for(m=0;strcmp(fword1[m].danci,"!
")!
=0;m++)//检测相同的单词在前面是否已经统计过
{
if(strcmp(word1[i],fword1[m].danci)==0)flag=0;
}
if(flag)
{
strcpy(fword1[k].danci,word1[i]);//将相同的单词分别存入结构体数组fword1[]和fword2[]中
strcpy(fword2[k].danci,word2[j]);
k++;strcpy(fword1[k].danci,"!
");strcpy(fword2[k].danci,"!
");
break;
}
}
}
}
for(i=0;strcmp(fword1[i].danci,"!
")!
=0;i++)//对文章1中相同单词个数的统计
{
fword1[i].num=0;
for(j=0;j{
if(strcmp(fword1[i].danci,word1[j])==0)fword1[i].num++;
}
fword1[i].bili=(float)fword1[i].num/(number1+1)*100;//相同单词在文章1中占的比例
}
for(i=0;strcmp(fword2[i].danci,"!
")!
=0;i++)//对文章2中相同单词个数的统计
{
fword2[i].num=0;
for(j=0;j{
if(strcmp(fword2[i].danci,word2[j])==0)fword2[i].num++;
}
fword2[i].bili=(float)fword2[i].num/(number2+1)*100;//相同单词在文章2中占的比例
}
printf("文章1单词总数:
%d\n",number1);
printf("文章2单词总数:
%d\n",number2);
printf("\n\n\n\t\t文章1\t\t文章2\n");
printf("\n相同单词\t个数\t百分比\t\t个数\t百分比\n");
for(i=0;strcmp(fword1[i].danci,"!
")!
=0;i++)
{
printf("%5s\t%d\t%5.2f%%\t%d\t%5.2f%%\n",fword1[i].danci,fword1[i].num,fword1[i].bili,fword2[i].num,fword2[i].bili);
}
}
/******************将文章1的统计结果保存到3.txt文本文件中********************/
voidsave1()
{
FILE*fp;
inti,a=1;
if((fp=fopen("3.txt","wb"))==NULL)
{
printf("3.txt文件无法打开!
\n");
//exit(0);
}
for(i=0;strcmp(fword1[i].danci,"!
")!
=0;i++)//将信息写入文件
{
if(fwrite(&fword1[i],sizeof(structword),1,fp)!
=1)
{
printf("存储错误!
\n");a=0;
}
}
if(a)printf("\n文章1统计结果已存入文件3.txt中,共%d条记录\n",i);//输出记录个数
fclose(fp);
}
/***************将文章2中的统计结果保存到4.txt文本文件中**********************/
voidsave2()
{
FILE*fp;
inti,a=1;
if((fp=fopen("4.txt","wb"))==NULL)
{
printf("4.txt文件无法打开!
\n");
//exit(0);
}
for(i=0;strcmp(fword2[i].danci,"!
")!
=0;i++)//将信息写入文件
{
if(fwrite(&fword2[i],sizeof(structword),1,fp)!
=1)
{
printf("存储错误!
\n");a=0;
}
}
if(a)printf("\n文章2统计结果已存入文件4.txt中,共%d条记录\n",i);//输出记录个数
fclose(fp);
}