有两个文本文件"mdwj.txt"(目的文件)和"dbwj.txt"(对比文件)
两个文件中,都是 中文词语,排列方式为 一行一个词语。
但两个文件都可能有几十万行。
要实现以下功能:
读取以上两个文件,输出"out.txt"。
out.txt中应该有所有mdwj.txt中包含的词语,并且,out.txt中的词语按照dbwj.txt的顺序排列,如果mdwj.txt中的词在dbwj.txt中找不到,则排到后面去,并且,两个文件中的词是“严格匹配”时,才进行排序,否则也排到后面。
例如:
mdwj.txt 中是这样的:
今天
集团
明天
高手
高兴
如果
青天
dbwj.txt中是这样的:
明天
青天大老爷
今天
没有
天天
天下
那么,out.txt中,应该输出如下内容:
明天
今天
集团
高手
高兴
如果
青天
我只实现了部分内容,如果mdwj.txt和dbwj.txt中都有的词,那可以排出来了,如果mdwj.txt中有,而dbwj.txt中没有的词,原本是要把这些词排到后面的,但,我没能实现。我觉得应该在我的源码中,33行后面加点东西,但怎么加都不对。。我想这样写,当j已经遍历了,即j从0直到 c了,还是没有符合条件的,这些词,数组,把它们写到temp[c+l]里面去,但我搞得都不对。
其中,我用“//”注释掉的行,就是我搞不清楚的地方。。。当然,也有可能是我其他地方搞错了,请不吝赐教!请告诉我,应该怎么写才对。。谢谢!
我写的源码如下:
代码: 全选
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<ctype.h>
#include<memory.h>
unsigned char mdwj[100][50];
unsigned char dbwj[100][50];
unsigned char temp[200][50];
int maxline=0;
int a,b,c,d;
int readdat1(void);
int readdat2(void);
void writedat(void);
void StrOR(void)
{
int i,m,j,k,l;
for(i=0;i<a;++i)
{
for(j=0;j<c;++j)
{
if(strlen(mdwj[i])==strlen(dbwj[j]))
{
for(k=0;k<strlen(mdwj[i]);++k)
if(mdwj[i][k]==dbwj[j][k])
temp[j][k]=mdwj[i][k];
}
else
continue;
}
// if(j == c && [color=#FF0000]这里怎么写[/color] )
// for(l=1;l<a;++l)
// for(k=0;k<strlen(mdwj[i]);++k)
// temp[c+l][k]=mdwj[i][k];
}
}
void main()
{
if(readdat1())
{printf("Bu neng da kai yao pai xu de wen jian.\n");
return;
}
if(readdat2())
{printf("Bu neng da kai ci pin wen jian.\n");
return;
}
StrOR();
writedat();
}
int readdat1(void)
{
FILE *fp;
int i=0;
char *p;
if((fp=fopen("mdwj.txt","r"))==NULL)
return 1;
while(fgets(mdwj[i],sizeof(mdwj),fp)!=NULL)
{p=strchr(mdwj[i],'\n');
if(p)
*p=0;
++i;
}
a=maxline=i;
fclose(fp);
return 0;
}
int readdat2(void)
{
FILE *fp;
int i=0;
char *p;
if((fp=fopen("dbwj.txt","r"))==NULL)
return 1;
while(fgets(dbwj[i],sizeof(dbwj),fp)!=NULL)
{
p=strchr(dbwj[i],'\n');
if(p)
*p=0;
++i;
}
c=maxline=i;
fclose(fp);
return 0;
}
void writedat(viod)
{
FILE *fp;
int i;
fp=fopen("out.txt","w");
for(i=0;i<c;++i)
{
if(temp[i][0]!=NULL)
{
printf("%s\n",temp[i]);
fprintf(fp,"%s\n",temp[i]);
}
}
fclose(fp);
}
因为以上源码只是作为测试用,并没有使用几十万行的词语来测试,所以数组的长度也就写得短点了,应该之后改大就可以了。
测试用的mdwj.txt和dbwj.txt以及用我的源码生成的结果out.txt见附件。