Autoword.cpp
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:3k
源码类别:

输入法编程

开发平台:

Visual C++

  1. // AppDict.cpp: implementation of the AppDict class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Autoword.h"
  6. #include "windows.h"
  7. #include "stdio.h"
  8. #include "resource.h"
  9. #include "DllManager.h"
  10. extern DllManager ChLib;//定义在主DLL中
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. Autoword::Autoword()
  15. {
  16. Curp=0;
  17. bufhead=0;
  18. buflong=0;
  19. chbuf[0]=0;
  20.     ChiSS[0]=0;
  21. }
  22. int Autoword::AppOne(char * pChi)
  23. {
  24. char NewWord[70];
  25. int ret=0;
  26. insertword(pChi,NewWord);
  27. if(NewWord[0]!=0)
  28. {
  29.     AppSetDict(NewWord);
  30.      ret=1;
  31. }
  32.     return ret;
  33. }
  34. int Autoword::AppSetDict(char *NewWord)
  35. {
  36. char temss[2000]="";
  37. char path[100]="c:\jsime\";
  38. FILE  *infp; 
  39. char ss[2000];
  40. ChLib.ChissToCodeC("c:\jsime\MainCode.txt", NewWord, temss);
  41. if(strlen(temss)==4)
  42. {
  43. infp=fopen("c:\jsime\AutoSource.txt", "a");   //打开文字文件 
  44. if(infp==NULL){
  45. MessageBox(0,"c:\jsime\AutoSource.txt装载失败","fopen",0);
  46. return -1;
  47. }
  48. sprintf(ss,"xdxa%s %s",temss,NewWord);
  49. fwrite(ss,strlen(ss),1,infp); 
  50. fclose(infp);
  51. }
  52. return 0;
  53. }
  54. /////////////////////////////////////////////////
  55. //
  56. int Autoword::insertword(char *ch,char *NewWord)
  57. {
  58. char tembuf[70];
  59. int ret=0;
  60. try
  61. {
  62. insertBuf(ch);          //把汉字插入到缓冲区中。
  63. getbuf(tembuf);            //扫描缓冲区,检查新词。
  64. //MessageBox(0,tembuf,0,0);
  65. ret=FindNewWord(tembuf,NewWord);//此程序已经实现。
  66.  } catch (...) {
  67.   MessageBox(0,"insertword","有错误发生",0);
  68.  }
  69. return ret;
  70. }
  71. //由于要求环以0作为结束符,所以环的长度应为61,总的存储长度必须62或以上。
  72. Autoword::insertBuf(char *ch)        //缓冲区采用环形缓冲
  73. {                              //要求缓冲区的指针指向当前下一个要插入位置。
  74. chbuf[Curp]=ch[0];
  75. chbuf[Curp+1]=ch[1];
  76. chbuf[Curp+2]=0;
  77. Curp=( Curp+2)%60;          //用运算进行环处理
  78. if (buflong==60)
  79. {
  80. bufhead=( bufhead+2)%60;
  81. }
  82. else
  83.    buflong+=2;//缓冲区的长度加1个汉字长度。
  84. }
  85. //要求缓冲区必须以0作为结束符
  86. Autoword::getbuf(char *tembuf)//从环形缓冲区中取出字符串
  87. {
  88. int lon;
  89. lon=strlen(&chbuf[bufhead]);
  90. if(lon>buflong)
  91.     sprintf(tembuf,"%s%s",&chbuf[bufhead],&chbuf[0]);
  92. else
  93. strcpy(tembuf,&chbuf[bufhead]);
  94. }
  95. //能从指定的串中找出最长匹配。
  96. int Autoword::FindNewWord(char *buf,char *mynewword)
  97. {
  98. char ss[1000],*p;
  99. int i,j,t,testlen=0,len;
  100. int ret=0;
  101. strcpy(ss,buf);
  102. len=strlen(ss);
  103. if(len>7)
  104. {
  105. _strrev(ss);
  106. p=ss;
  107. for(i=4;i<len;i++)
  108. {
  109. if(ss[i]==p[0])
  110. {
  111. for(j=i,t=0;j<len;j++,t++)
  112. {
  113. if(ss[j]!=p[t])
  114. break;
  115. }
  116. if(testlen<t)
  117. testlen=t;
  118. }
  119. }
  120. ss[testlen]=0;
  121. if(strlen(ss)>=4)
  122. {
  123. _strrev(ss);
  124. strcpy(mynewword,ss);
  125. ret=strlen(ss);
  126. }
  127. }
  128. return ret;
  129. }