Read_chEx.cpp
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:4k
- // loadmylib.cpp: implementation of the loadmylib class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "Read_chEx.h"
- #include "stdio.h"
- Read_chEx::Read_chEx()
- {
- readpp=NULL;
- Enstr[0]=0; //设置吵兵
- Chistr[0]=0;
- pChistr=&Chistr[1];
- }
- //返回为2说明已经进入边界,
- //必须保证下次有数据可读,否则需报告信息
- int Read_chEx::SetData(int Lmode,char *enstr)
- {
- int ret=0;
- long ID;
- strcpy(Enstr,enstr);
- mode=Lmode;
- toword=1;
- ID=GetIndex(Enstr); //此函数是库中的函数,由库完成
- if(ID==-1)
- ID=findNextID(Enstr);
- if(ID>=0)
- {
- //GetChlen(ID); //此函数是库中的函数,由库完成
- ReadID=ID;
- CurID=ID;
- if(SetNode(&ReadID)==2)
- return 2;
- }
- else
- {
- ret= 1;//MessageBox(0,"取ID==-1","ID",0);
- }
- return ret;
- }
- //toword=1表示向下,toword=0表示向上
- //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。
- int Read_chEx::GetWord(char *ss,char *en)
- {
- int ret;
- strcpy(en,Enstr);
- if(toword==1)
- {
- ret=GetNextWord(ss);
- }
- if(toword==0)
- {
- ret=GetUpWord(ss);
- }
- return ret;
- }
- //torword =1是向下,torword=0是向上
- //flage=1表示从基本到扩展,flage=2表示从扩展到基本
- //flage=3表示仅基本,flage=4表示仅扩展
- //readflge=0表示读取指针在基本区内
- //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。
- int Read_chEx::GetNextWord(char *ss)
- {
- int ret=0;
- if(ReadID<0)//解除锁定
- {
- ReadID=0;
- if(SetNode(&ReadID)==2)//2表示越界
- return 1;
- else
- return 3;//解除成功
- }
- if(ReadID>=(*IndexNum))
- return 1;
-
- if(readpp[0]==0)//表示当前无数据可读
- return 1;
- strcpyNextWord(ss,readpp);
- readpp+=strlen(ss);
- if(readpp[0]==0)//数据已经取完,要求得到下一结点
- {
- ReadID++;
- if(SetNode(&ReadID)==2)
- return 2;
- }
- else
- readpp++;
- return 0;
- }
- //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。
- int Read_chEx::GetUpWord(char *ss)
- {
- int ret=0;
- char *p;
- ss[0]=0;
- if(ReadID>=(*IndexNum))//解除锁定
- {
- ReadID=(*IndexNum)-1;
- if(SetNode(&ReadID)==2)//2表示越界
- return 1;
- else
- return 3;//解除成功
- }
- if(ReadID<0)
- return 1;
- if(readpp[0]==0)//表示当前无数据可读
- return 1;
- p=readpp;
- p--;
- if(*p==0)
- {
- ReadID--;
- if(SetNode(&ReadID)==2)
- return 2;
- }
- else
- readpp-=2;
- strcpyUpWord(ss,readpp);
- readpp-=strlen(ss)-1;
- return 0;
- }
- //2表示越界,0表示成功
- int Read_chEx::SetNode(long *ID)
- {
- if(toword==1)
- {
- if(*ID>=(*IndexNum))
- return 2;
- }
- else
- {
- if(*ID<0)
- return 2;
- }
- GetChss(*ID,Chistr1,Chistr2,Enstr);
- switch(mode)
- {
- case 1:
- if(Chistr2[0]==0 )
- sprintf(pChistr,"%s",Chistr1);
- else
- {
- if(Chistr1[0]==0)
- sprintf(pChistr,"%s",Chistr2);
- else
- sprintf(pChistr,"%s;%s",Chistr1,Chistr2);
- }
- break;
- case 2:
- if(Chistr1[0]==0 )
- sprintf(pChistr,"%s",Chistr2);
- else
- {
- if(Chistr2[0]==0)
- sprintf(pChistr,"%s",Chistr1);
- else
- sprintf(pChistr,"%s;%s",Chistr2,Chistr1);
- }
- break;
- case 3:
- sprintf(pChistr,"%s",Chistr1);
- break;
- case 4:
- sprintf(pChistr,"%s",Chistr2);
- break;
- }
- while(*pChistr==0)
- {
- if(toword==1)
- {
- (*ID)++;
- if((*ID)>=(*IndexNum))
- return 2;
- }
- else
- {
- (*ID)--;
- if(ID<0)
- return 2;
- }
- GetChss((*ID),Chistr1,Chistr2,Enstr);
- switch(mode)
- {
- case 1:
- sprintf(pChistr,"%s;%s",Chistr1,Chistr2);
- break;
- case 2:
- sprintf(pChistr,"%s;%s",Chistr2,Chistr1);
- break;
- case 3:
- sprintf(pChistr,"%s",Chistr1);
- break;
- case 4:
- sprintf(pChistr,"%s",Chistr2);
- break;
- }
- }
- if(toword==1)
- {
- readpp=pChistr;
- }
- else
- {
- readpp=&pChistr[strlen(pChistr)-1];
- }
- return 0;
- }
- ///////////////////////////////////////////////
- Read_chEx::strcpyNextWord(char *CC,char* Chss)
- {
- int i=0;
- while(Chss[i]!=0&&Chss[i]!=';')
- {
- CC[i]=Chss[i];
- i++;
- }
- CC[i]=0;
- }
- int Read_chEx:: sort(int num,char *retss)
- {
- MySort(CurID,num,retss);
- return 0;
- }
- ///////////////////////////////////////////////////////
- Read_chEx::strcpyUpWord(char *CC,char* Chss)
- {
- int i=0;
- char *p;
- p=Chss;
-
- while(*p!=0&&*p!=';')
- {
- CC[i]=*p;
- i++;
- p--;
- }
- CC[i]=0;
- _strrev(CC);
- }