“遍历后,还未匹配的”这样的条件怎么写?

软件和网站开发以及相关技术探讨
回复
robert870119
帖子: 768
注册时间: 2007-03-05 20:45

“遍历后,还未匹配的”这样的条件怎么写?

#1

帖子 robert870119 » 2009-02-23 17:00

做不来了,只实现了部分功能。。。教教我啊。
有两个文本文件"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见附件。
附件
test.zip
(473 Bytes) 已下载 25 次
回复