2023年12月22日发(作者:)
#include
hitem=NULL; Recnum=0L; hsize=Recsize=Fieldnum=0; if((fp=fopen(filename,"r+b"))==NULL) return; fread(&Recnum,4,1,fp); if(*(char*)&Recnum!=3) { fclose(fp); fp=NULL; return; } fread(&Recnum,4,1,fp); fread(&hsize,2,1,fp); Fieldnum=hsize/0x20-1; hsize++; fread(&Recsize,2,1,fp); hitem=new Column[Fieldnum]; tmpbuf=new char [11*Fieldnum+2*Fieldnum]; if(tmpbuf) { for(int i=0; i Cdbfile::~Cdbfile(void){ if(fp) fclose(fp); if(hitem) { delete hitem[0].name; delete hitem; } fp=NULL; hitem=NULL;}BOOL Cdbfile::IsOpen(void){ return fp!=NULL;}int Cdbfile::GetFieldidx(const char *itemname){ if(hitem) for(int i=0; i if(Fieldnum==0) return 0; for(int i=0; i void *Cdbfile::GetFieldData(long recno, const char *fname){ char *buff; int fieldno, size; fieldno=GetFieldidx(fname); if(fieldno<0) return NULL; size = Fieldlen[fieldno]; if(fieldno) size -= Fieldlen[fieldno-1]; buff=new char [size+1]; if(buff) GetFieldData(recno,fieldno,buff); return buff;}BOOL Cdbfile::GetFieldData(long recno, const char *fname, char *buff, int bufsize){ buff[0] = 0; int fieldno=GetFieldidx(fname); if(fieldno<0) return -1; return GetFieldData(recno,fieldno,buff,bufsize);}BOOL Cdbfile::GetFieldData(long recno, int fieldno, char *buff, int bufsize){ int num=0; long off; buff[0] = 0; if(fp==NULL || recno<0 || recno>=Recnum || fieldno<0 || fieldno>=Fieldnum) return 0; off=(long)hsize+recno*(Fieldlen[Fieldnum-1]+1); if(fieldno) { num=Fieldlen[fieldno-1]; off+=num; } fseek(fp,off,SEEK_SET); num=Fieldlen[fieldno]-num; if(num>=bufsize) { printf("buffer overflow!/n"); exit(3); } fread(buff,num,1,fp); if(toupper(hitem[fieldno].type)=='C') { while(num>=0 && buff[--num]==' ') ; num++; } buff[num] = 0; return 1;} long Cdbfile::SearchSortStr(int fieldno, const char *str, int igcase){ long temp; long leftno = 0L; long rightno = Recnum; int l2 = GetFieldlen(fieldno); if(fp==NULL || fieldno<0 || fieldno>=Fieldnum) return -1; while(leftno<=rightno) { char *buf = new char [l2]; temp = (leftno+rightno)>>1; GetFieldData(temp,fieldno,buf); int val; if(igcase) val = stricmp(buf,str); else val = strcmp(buf,str); delete buf; if(val==0) return temp; if(val>0) rightno = temp-1; else leftno = temp+1; } return -1;}long Cdbfile::SearchStr(int fieldno, const char *str, long startno){ int l2 = GetFieldlen(fieldno); if(fp==NULL || startno<0 || startno>=Recnum || fieldno<0 || fieldno>=Fieldnum) return -1; char *buf = new char [l2]; for(long i=startno; i long Cdbfile::SearchNextStr(int fieldno, const char *str){ if(Lookno<0) return -1; return(SearchStr(fieldno,str,Lookno));}


发布评论