当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 1 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : “遍历后,还未匹配的”这样的条件怎么写?
帖子发表于 : 2009-02-23 17:00 

注册: 2007-03-05 20:45
帖子: 768
送出感谢: 0 次
接收感谢: 0 次
做不来了,只实现了部分功能。。。教教我啊。
有两个文本文件"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]
被下载 1 次


_________________
my blog :
http://tiancai1hao.blogbus.com
页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 1 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译