⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wb5.c

📁 该套软件用于提取王码98(或者其他版本)的五笔数据
💻 C
字号:
#include           <stdio.h>
#include           <stdlib.h>
#include           <float.h>
#include           <graphics.h>
#include           <math.h>
#include           <conio.h>
#include           <string.h>

#define            NG 			1
#define            OK 			0
#define            BCD          unsigned char
#define            CHR          unsigned char
#define            INT          unsigned int
#define 		   PTR			long


FILE *stream_father;
FILE *stream_son;
FILE *stream_sonx;

PTR hz_search(BCD *cd, long cnt, PTR *tpt);
void read_rec(CHR *buf,long pt);
int nf_bcdcmp(BCD *pd, BCD *ps, int n);

long filesize(FILE *stream)
{
   long curpos, length;

   curpos = ftell(stream);
   fseek(stream, 0L, SEEK_END);
   length = ftell(stream);
   fseek(stream, curpos, SEEK_SET);
   return length;
}

/*这时一个测试程序DOS下, 输入ffff可退出*/

void main(void)
{
	long 	fl;
	long 	rec_max;
	int		r;
	PTR		x;
	CHR		c;

	CHR	 	ibf[4];
	CHR     data[6];
	CHR 	hz[3];

	stream_son = fopen("winwb98.bin","rb");
	if(stream_son==NULL)
	{
		printf("Error: winwb98.bin not find! \n");
		return;
	}

	fl=filesize(stream_son);
	rec_max=fl/6;

	while(1)
	{
		scanf("%4s", ibf);

		for(r=0;r<4;r++)
		{
			if(ibf[r]==0)
			{
				for(;r<4;r++)	ibf[r]=' ';
			}
		}

		c=ibf[0];
		ibf[0]=ibf[3];
		ibf[3]=c;
		c=ibf[1];
		ibf[1]=ibf[2];
		ibf[2]=c;     					//reverse

		//if "ffff" exit
		if(ibf[0]=='f' && ibf[1]=='f' && ibf[2]=='f' && ibf[3]=='f') break;
		r=hz_search(ibf,rec_max,&x);
		if(r==OK)
		{
			read_rec(data,x*6);
			hz[0]=data[4];
			hz[1]=data[5];
			hz[2]='\0';
			printf("\n%s",hz);
		}
		else
		{
			printf("not find!\n");
		}

  }
  fclose(stream_son);
}


/********************************************************************
	HZ  search
		BCD *cd		HZ code
		int cnt		HZ total nunber
		PTR *tpt	set number
		< return >	FFFF:not find
					*   :pointer
*********************************************************************/
PTR hz_search(BCD *cd, long cnt, PTR *tpt)
{
	CHR buf_p[6];
	CHR buf_pp[6];

	long  pp,p;
	long len;
	long i, r;
	*tpt=0;
	p=0;

	len=cnt;
	while(1){
		if(len<10){			/* last 10 ? */
			r=NG;
			for(i=len;i>0;i--){
				read_rec(buf_p,p);
				if(nf_bcdcmp(cd,buf_p,4)==0){	/* code match ? */
					r=OK;
					break;
				}
				p+=6;		/* table++ */
				*tpt+=1;
			}
			break;
		}
		i=len%2;
		len/=2;				/* search area 1/2 */
		pp=p+len*6;
		read_rec(buf_p,pp);
		r=nf_bcdcmp(cd,buf_p,4);
		if     (r==0){		/* search code(cd) = table code(pp) */
			r=OK;
			p=pp;
			*tpt+=len;
			break;
		}
		else if(r==1){		/* search code(cd) > table code(pp) */
			p=pp;
			*tpt+=len;
			len+=i;
		}
	}
	if(r==OK){
	}
	else{
		r=0xFFFF;
	}
	return r;
}

void read_rec(CHR *buf,long pt)
{
	INT i;
	CHR c;

	fseek(stream_son, pt, SEEK_SET);
	for(i=0;i<6;i++)
	{
		c=fgetc(stream_son);
		buf[i]=c;
	}
}


/****************************************
	BCD compare(near & far data)
		BCD *pd
		BCD far *ps
		return	pd>ps  1
				pd<ps  2
				pd=ps  0
****************************************/
int nf_bcdcmp(BCD *pd, BCD *ps, int n)
{
	for(;n>0;n--){
		if(*(pd+n-1)>*(ps+n-1))	return  1;
		if(*(pd+n-1)<*(ps+n-1))	return	2;
	}
	return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -