Read_ch.cpp
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:8k
- // loadmylib.cpp: implementation of the loadmylib class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "Read_ch.h"
- #include "stdio.h"
- Read_ch::Read_ch()
- {
- readpp=NULL;
- readflge=0;
- Enstr[0]=0; //设置吵兵
- Chistr[0]=0;
- ChistrEx[0]=0;
- pChistr=&Chistr[1];
- pChistrEx=&ChistrEx[1];
- }
- //toword=1表示向下,toword=0表示向上,-1保持不变
- int Read_ch::Changtoword(int Ltoword)
- {
- int ret=0,ret2=0;
- if(toword==Ltoword)//
- return 0;
- toword=Ltoword;
- if(toword==1) //由上转为下
- {
- readpp++;
- if(*readpp==0) //本段无数据,需要跳转区域或节点
- {
- switch(mode)
- {
- case 1://可以从基本区到扩展区
- if(readflge==0 && *pChistrEx!=0)//现在在基本区,并且扩展区非空
- {
- readpp=pChistrEx;
- readflge=1;
- }
- else//需要重新取节点
- {
- ret=1;
- }
- break;
- case 3:
- ret=1;
- //需要重新取节点
- break;
- case 2:
- if(readflge==1 && *pChistr!=0)
- {
- readpp=pChistr;
- readflge=0;
- }
- else
- {
- ret=1;//需要重新取节点
- }
- break;
- case 4:
- ret=1;//需要重新取节点
- break;
- }
- }
- else
- readpp++;//说明指针在数据的中间。
- }
- ///////////////////////////////////////////
- if(toword==0)//由下转为上
- {
- readpp--;
- if(*readpp==0)
- {
- switch(mode)
- {
- case 1:
- //现在在扩展区,基本区非空。
- if(readflge==1 && *pChistr!=0)
- {
- readpp=&pChistr[strlen(pChistr)-1];
- readflge=0;
- }
- else//需要重新取节点
- {
- ret=1;
- }
- break;
- case 3:
- ret=1;
- //需要重新取节点
- break;
- case 2:
- if(readflge==0 && *pChistrEx!=0)//现在在基本区,并且扩展区非空
- {
- readpp=&pChistrEx[strlen(pChistrEx)-1];
- readflge=1;
- }
- else
- {
- ret=1;//需要重新取节点
- }
- break;
- case 4:
- ret=1;
- //需要重新取节点
- break;
- }
- }
- else
- readpp--;//说明指针在数据的中间。
- }
- if(ret==1)
- {
- if(ReadID==-1||ReadID==(*IndexNum)-1)
- ret2=1;
- if(toword==0)
- {
- ReadID--;
- }
- else
- {
- ReadID++;
- }
- GetChss(ReadID,pChistr,pChistrEx,Enstr);
- ret=SetReadpp(toword);
- while(ret==1)
- {
- ReadID++;
- if(ReadID>=(*IndexNum))
- {
- return 2;
- }
- GetChss(ReadID,pChistr,pChistrEx,Enstr);
- ret=SetReadpp(toword);
- }
- }
- return ret2;
- }
- //toword=1表示向下,toword=0表示向上,-1保持不变
- //mode=1表示从基本到扩展,mode=2表示从扩展到基本
- //mode=3表示仅基本,mode=4表示仅扩展
- //返回为1表示本区无可用需要的数据。必须重新设置。
- //一般情况下一个区是有数据的,但不一定有可用数据。
- //要依模式而定,3或4模式有可能无可用需要的数据
- int Read_ch::SetReadpp(int Ltoword)
- {
- int ret=0;
- if(Ltoword>=0)
- toword=Ltoword;
- if(toword==1)//表示向下
- {
- switch(mode)
- {
- case 1:
- if(*pChistr!=0)
- {
- readpp=pChistr;
- readflge=0;
- }
- else
- {
- readpp=pChistrEx;
- readflge=1;
- }
- break;
- case 3:
- if(*pChistr!=0)
- {
- readpp=pChistr;
- readflge=0;
- }
- else
- {
- ret=1; //本区无数据,需要重新设置。
- }
- break;
- case 2:
- if(*pChistrEx!=0)
- {
- readpp=pChistrEx;
- readflge=1;
- }
- else
- {
- readpp=pChistr;
- readflge=0;
- }
- break;
- case 4:
- if(*pChistrEx!=0)
- {
- readpp=pChistrEx;
- readflge=1;
- }
- else
- {
- ret=1; //本区无数据,需要重新设置。
- }
- break;
- }
- }
- if(toword==0)//表示向上
- {
- switch(mode)
- {
- case 1://扩展区 至基本区
- if(*pChistrEx!=0)
- {
- readpp=&pChistrEx[strlen(pChistrEx)-1];//指向最后一个字符
- readflge=1;
- }
- else
- {
- readpp=&pChistr[strlen(pChistr)-1];//指向最后一个字符
- readflge=0; //标记读取指针在扩展区
- }
- break;
- case 3://仅基本区
- if(*pChistr!=0)
- {
- readpp=&pChistr[strlen(pChistr)-1];//指向最后一个字符
- readflge=0;
- }
- else
- {
- ret=1;//基本区无数据,要求重新设置。
- }
- break;
- case 2://扩展区至基本区
- if(*pChistr!=0)
- {
- readpp=&pChistr[strlen(pChistr)-1];
- readflge=0;
- }
- else
- {
- readpp=&pChistrEx[strlen(pChistrEx)-1];
- readflge=1;
- }
- break;
- case 4://仅扩展区
- if(*pChistrEx!=0)
- {
- readpp=&pChistrEx[strlen(pChistrEx)-1];
- readflge=1;
- }
- else
- ret=1;//扩展区无数据,要求重新设置
- break;
- }
- }
- return ret;
- }
- //返回为2说明已经进入边界,
- //必须保证下次有数据可读,否则需报告信息
- int Read_ch::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;
- GetChss(ReadID,pChistr,pChistrEx,Enstr);
- ret=SetReadpp(toword);
- while(ret==1)
- {
- ReadID++;
- if(ReadID>=(*IndexNum))
- {
- return 2;
- }
- GetChss(ReadID,pChistr,pChistrEx,Enstr);
- ret=SetReadpp(toword);
- }
- }
- else
- {
- ret= 1;//MessageBox(0,"取ID==-1","ID",0);
- }
- return ret;
- }
- //toword=1表示向下,toword=0表示向上
- //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。
- int Read_ch::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_ch::GetNextWord(char *ss)
- {
- int ret=0;
-
- if(readpp[0]==0)//表示当前无数据可读
- return 1;
- strcpyNextWord(ss,readpp);
- readpp+=strlen(ss);
- if(readpp[0]==0)//区域调整
- {
- if( mode==1 && readflge==0)//从基本到扩展
- {
- readpp=pChistrEx;
- readflge=1;
- }
- if(mode==2 && readflge==1)//从扩展到基本
- {
- readpp=pChistr;
- readflge=0;
- }
- }
- else{
- readpp++;
- }
- //调整后为空
- if(readpp[0]==0)//数据已经取完,要求得到下一结点
- {
- ReadID++;
- if(SetNode(ReadID)==2)
- return 2;
- }
- return 0;
- }
- int Read_ch::SetNode(long ID)
- {
- int ret2;
- if(ReadID>=(*IndexNum))
- return 2;
- GetChss(ReadID,pChistr,pChistrEx,Enstr);
- ret2=SetReadpp(-1);
- while(ret2==1)
- {
- ReadID++;
- if(ReadID>=(*IndexNum))
- return 2;
- GetChss(ReadID,pChistr,pChistrEx,Enstr);
- ret2=SetReadpp(-1);
- }
- return 0;
- }
- //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。
- int Read_ch::GetUpWord(char *ss)
- {
- int ret=0;
- if(ReadID>=(*IndexNum))
- {
- ReadID=(*IndexNum)-1;
- if(SetNode(ReadID)==2)
- return 2;
- else
- return 1;
- }
- if(readpp[0]==0)//表示当前无数据可读
- return 1;
- strcpyUpWord(ss,readpp);
- readpp-=strlen(ss);
- if(readpp[0]==0)//区域调整
- {
- if( mode==1 && readflge==1)//从扩展到基本
- {
- readpp=&pChistr[strlen(pChistr)-1];
- readflge=0;
- }
- if(mode==2 && readflge==0)//从基本到扩展
- {
- readpp=&pChistrEx[strlen(pChistrEx)-1];
- readflge=1;
- }
- }
- else{
- readpp--;
- }
- //调整后为空
- if(readpp[0]==0)//数据已经取完,要求得到下一结点
- {
- ReadID--;
- if(SetNode(ReadID)==2)
- return 2;
- }
- return 0;
- }
- ///////////////////////////////////////////////
- Read_ch::strcpyNextWord(char *CC,char* Chss)
- {
- int i=0;
- while(Chss[i]!=0&&Chss[i]!=';')
- {
- CC[i]=Chss[i];
- i++;
- }
- CC[i]=0;
- }
- int Read_ch:: sort(int num,char *retss)
- {
- MySort(CurID,num,retss);
- return 0;
- }
- ///////////////////////////////////////////////////////
- Read_ch::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);
- }