libarryOut.cpp
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:7k
- // loadmylib.cpp: implementation of the loadmylib class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "libarryOut.h"
- #include "stdio.h"
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- libarryOut::libarryOut()
- {
- MainCode=NULL;
- CodeNum=0;
- CodeLong=0;
- }
- libarryOut::~libarryOut()
- {
- }
- //输出单个字的主要编码
- //库必须以第一个汉字为序以便进行二分法比较
- //开头的四个字节为库的编码个数CodeNum,后路回车
- libarryOut::OutsourceOne(char * outLibName)
- {
- char ss1[2000],ss[2000],cc[1000],testss[1000],*p=NULL;
- char temcodess[1000];
- unsigned long recodenum=0,codenum=0;
- unsigned long tt,i,klen;
- FILE * outfp;
- char *LMaincode;
-
- unsigned short int *intp1;
- char intpss1[6];
- intp1=(unsigned short*)intpss1;
- outfp=fopen(outLibName, "wb"); /*打开目标文件*/
- if(outfp==NULL){
- MessageBox(0,"Outsource函数打开文件失败","错误",0);
- return 0;
- }
- tt=*IndexNum;
- LMaincode=new char[0xffff*10+100];
- for(i=0;i<65535;i++)
- {
- LMaincode[i*10]=0;
- }
- for(i=0;i<tt;i++)
- {
- p=&CLIB_EnCh[LIBIndex[i]];
- strcpy(ss,p);
- if(!((ss[0]>='A'&& ss[0]<='Z')))
- MessageBox(0,p,"错误",0);
- p+=strlen(ss)+1;
- strcpy(cc,p);
- //重码必需分开
- p = strtok(cc, ";");
- while (p!=NULL)
- {
- sprintf(testss,"%s",p);
- klen=strlen(ss);
- if(strlen(testss)==2 && (klen>=2 && klen <= 4))
- {// klen取大于或等于2是为了在两个字时组成4个长的编码,1个就不行了,小于4是为了去除拼音
- // testss==2是为了只取单个字的编码
- if(klen==2)
- sprintf(temcodess,"%s %s xdxa",p,ss1);
- if(klen==3)
- sprintf(temcodess,"%s %s xdxa",p,ss1);
- if(klen==4)
- sprintf(temcodess,"%s %sxdxa",p,ss1);
- //以上是为了统一输出宽度
- intpss1[1]=*p;
- intpss1[0]=*(p+1);
- if(LMaincode[*intp1*10]==0)//只输出第一次出现的字
- {
- strcpy(&LMaincode[*intp1*10],temcodess);
- codenum++;
- }
- }
- p = strtok(NULL, ";");
- }
- }
- fwrite(&codenum,sizeof(unsigned long),1,outfp);
- fprintf(outfp,"xdxa");
- sprintf(temcodess,"%ld",codenum);
- MessageBox(0,temcodess,"生成词个数",0);
- for(i=0;i<0xffff;i++)
- {
- if(LMaincode[i*10]!=0)
- {
- fprintf(outfp,"%s",&LMaincode[i*10]);
- }
- }
- delete[]LMaincode;
- fclose(outfp);
- return 0;
- }
- //反编码输出全部的汉字编码
- libarryOut::Outsource(char * outLibName)
- {
- char ss[5000],cc[5000],*p=NULL;
- unsigned long tt,i;
- FILE * outfp;
- outfp=fopen(outLibName, "wb"); /*打开目标文件只读*/
- if(outfp==NULL){
- MessageBox(0,"Outsource函数打开文件失败","错误",0);
- return 0;
- }
- tt=*IndexNum;
- for(i=0;i<tt;i++){
- p=&CLIB_EnCh[LIBIndex[i]];
- strcpy(ss,p);
- p+=strlen(ss)+1;//把代码转换成字符串
- strcpy(cc,p);
- //重码必需分开
- p = strtok(cc, ";");
- while (p!=NULL)
- {
- //MessageBox(0,p,"错误",0);
- fprintf(outfp,"%s %sxdxa",ss,p);
- p = strtok(NULL, ";");
- }
- // fprintf(outfp,"%s %sxdxa",ss,p);
- }
- fclose(outfp);
- return 0;
- }
- //CodeNum,CodeLong ,MainCode为全局变量,可提高多次转换码时的速度
- long libarryOut::ChissToCode(char *MainCodeLibName,char *chiss,char *resultss)
- {
- FILE *infp;
- int ret,i;
- char temss[100];
- if(MainCode==NULL)
- {
- CodeLong=9;//以库文件中实际的长度为准
- /////////////////////////////////////////////////////////////////
- //主字库装入
- infp=fopen(MainCodeLibName, "rb"); /*打开文字文件只读*/
- if(infp==NULL){
- MessageBox(0,MainCodeLibName,"ChissToCode函数打开文件失败",0);
- return 0;
- }
- //取代码数
- ret=fread(&CodeNum,4,1,infp);
- if(ret==-1)
- {
- MessageBox(0,"ChissToCode函数读取词库大小失败","错误",0);
- return 0;
- }
- MainCode=new char[CodeNum*10+10000];
- ret=fread(temss,2,1,infp); //再跳过2个字节
- ret=fread(MainCode,CodeNum*CodeLong,1,infp);
- MainCode[0];
- if(ret==-1)
- {
- MessageBox(0,"ChissToCode函数读取主词库失败","错误",0);
- return 0;
- }
- //主字库装入完毕
- /////////////////////////////////////////////////////////////////
- }
- if(chiss!=NULL)
- {
- for(i=0;i<10;i++)
- temss[i]=chiss[i];
- TranslatewbCode(MainCode,CodeNum,CodeLong,chiss,resultss);
- }
- //MessageBox(0,resultss,"转换结果",0);
- //&maincode[codenum*CodeLong-9];
- return 0;
- }
- //把汉字串转换成五笔编码格式
- //maincode为加载库,codenum为主编码的个数,CodeLong为单个编码的长度
- int libarryOut::TranslatewbCode(char *maincode,unsigned long codenum,unsigned long CodeLong,char *chiss,char* resultss)
- {
- char temresultss[10];
- unsigned long len,i;
- char ss[100];
- len=strlen(chiss);
- if(len%2!=0)
- return 1;
- if( len==2)
- MainFindtoCode(maincode,codenum,CodeLong,chiss,resultss);
- if( len==4)
- {
- MainFindtoCode(maincode,codenum,CodeLong,chiss,temresultss);
- resultss[0]=temresultss[0];
- resultss[1]=temresultss[1];
- resultss[2]=temresultss[4+0];
- resultss[3]=temresultss[4+1];
- resultss[4]=0;
- }
- if( len==6)
- {
- MainFindtoCode(maincode,codenum,CodeLong,chiss,temresultss);
- resultss[0]=temresultss[0];
- resultss[1]=temresultss[4];
- resultss[2]=temresultss[8];
- resultss[3]=temresultss[8+1];
- resultss[4]=0;
- }
- if( len>6)
- {
- for(i=0;i<6;i++)
- ss[i]=chiss[i];
- ss[i]=0;
- MainFindtoCode(maincode,codenum,CodeLong,ss,temresultss);
- resultss[0]=temresultss[0];
- resultss[1]=temresultss[4];
- resultss[2]=temresultss[8];
- ss[0]=chiss[len-2];
- ss[1]=chiss[len-2+1];
- ss[2]=0;
- MainFindtoCode(maincode,codenum,CodeLong,ss,temresultss);
- resultss[3]=temresultss[0];
- resultss[4]=0;
- }
- return 0;
- }
- //在指定的库中转换汉字串,
- //maincode为加载库,格式为先为汉字,后为编码。
- //codenum为主编码的个数,CodeLong为单个编码的长度
- //库必须以第一个汉字为序以便进行二分法比较
- int libarryOut::MainFindtoCode(char *maincode,unsigned long codenum,unsigned long CodeLong,char *chiss,char* resultss)
- {
- unsigned short int *intp2,*intp1;
- long high,low,mid,i,len;
- char intpss1[6],intpss2[6],temss[1000],temss1[10];
- char temresultss[10];
- int t;
- temss[0]=0;
- resultss[0]=0;
- intp1=(unsigned short*)intpss1;
- intp2=(unsigned short*)intpss2;
- len=strlen(chiss);
- t=len/2;
- for(i=0;i<t;i++)
- {
- high=codenum-1;
- low=0;
- intpss1[1]=chiss[i*2];
- intpss1[0]=chiss[i*2+1];
- while(high>=low)
- {
- mid=low+(high-low)/2;
- //&maincode[mid*CodeLong];
- intpss2[1]=maincode[mid*CodeLong];
- intpss2[0]=maincode[mid*CodeLong+1];
- if(*intp1==*intp2)//由于字符型转换成了整型所有可以直接比较
- {
- temresultss[0]=maincode[mid*CodeLong+3];
- temresultss[1]=maincode[mid*CodeLong+3+1];
- temresultss[2]=maincode[mid*CodeLong+3+2];
- temresultss[3]=maincode[mid*CodeLong+3+3];
- temresultss[4]=0;
- strcat(resultss,temresultss);
- break;
- }
- if(*intp1>*intp2)
- low=mid+1;
- else
- high=mid-1;
- }////while
- if(high<low)
- {
- temss1[0]=chiss[i*2];
- temss1[1]=chiss[i*2+1];
- temss1[2]=0;
- if(strlen(temss)<990)
- strcat(temss,temss1);
- else
- {
- MessageBox(0,"有太多的字未找到,请重新组织","主字库中没有要找的字",0);
- return 1;
- }
- }
- }////for
- // if(temss[0]!=0)
- // MessageBox(0,temss,"主字库中没有要找的字",0);
- return 0;
- }