中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
<   <<   [1] [2]  >>
作者:
标题: Ghost一键恢复定制版 上一主题 | 下一主题
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 16 楼』:  

看上去不错,我也要源码! tdaim@sina.com谢谢!


2005-1-17 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qingwashaoye
中级用户




积分 271
发帖 74
注册 2004-11-17
状态 离线
『第 17 楼』:  

也给我一份源码吧!谢谢!qingwashaoye@hotmail.com


2005-1-18 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jiaking
中级用户




积分 223
发帖 52
注册 2004-3-7
状态 离线
『第 18 楼』:  

也给我一份源码吧!谢谢!这么多人要代码,楼主何不慷慨点,放上来让我们大家学学,一起进步?zhuhuijia@126.com


2005-1-18 00:00
查看资料  发送邮件  发短消息 网志  OICQ (53379921)  编辑帖子  回复  引用回复
crshen
中级用户




积分 447
发帖 126
注册 2004-2-10
状态 离线
『第 19 楼』:  

以下是引用jiaking在2005-1-18 1:36:07的发言: 也给我一份源码吧!谢谢! 这么多人要代码,楼主何不慷慨点,放上来让我们大家学学,一起进步?
这位大侠说得对,可惜你没看看这是什么时候的帖子,当时我发贴后长久没人回应,以为没什么用,竟然把源程序删除了,隔了4个月多,才有人要。 由于后面半年我自己外出学习,一直未能回复大家,现在既然有人要,只好重新做了个提取、显示汉字的程序,附后, 使用说明: 1. 程序本来是tc++编译的,加上wildargs.obj支持可以使用*和?通配符,现改为tc2程序,仍可运行,但不支持通配符; 2. 本程序运行要ucdos下的hzk16支持; 3. 对需要处理的程序进行处理后生成2个文件:Hz.h和Hzlib.c,其实为程序内嵌小汉字库; 4. 把程序相关部分复制到一个程序中,或者利用工程文件也可以,已测试能通过tc2.0编译。 附:hz2c.c 提取汉字程序 #include "graphics.h" #include "stdio.h" #include "stdlib.h" #include "conio.h" #include "string.h" #define macHzNum 7000 /*可以记录的汉字最多字数*/ #define macMaxLineLength 256 /*源程序中每行的最大长度*/ unsigned int HzSum=0 ; /*记录小字库数组中的汉字数*/ FILE*fp1 ; /* C,CPP源程序文件的文件指针 */ FILE*fp2 ; /* 生成的hz.h文件的文件指针 */ FILE*fp3 ; /* 生成的hzlib.c文件的文件指针 */ FILE*fHz ; /* UCDOS的16点阵字库HZK16的文件指针 */ unsigned char Chinese[2]; /*记录一个汉字的内码*/ char HeadFile[]="hz.h" ; /*生成的.H文件的文件名*/ char CFile[]="hzlib.c" ; /*生成的.C文件的文件名*/ unsigned int HugeBegin=1800 ; /*使用Huge编译模式的最少汉字个数*/ unsigned char IsHuge=0 ; /*是否需要Compact、Large、Huge变异模式的标志*/ struct strHz { unsigned char QuHao ; /*汉字的区号*/ unsigned char WeiHao ; /*汉字的位号*/ unsigned int RecNum ; /*汉字在HZK16文件中的记录号*/ unsigned char Chinese[2]; /*记录汉字的内码*/ } ; /*此结构记录一个汉字的区号,位号和字库中的记录号、内码*/ struct strHz lay[macHzNum]; /*存储结构的数组*/ /*此函数根据输入汉字的区号,位号在小字库数组中查找这个*/ /*汉字是否已经提取进入小字库数组。如果没有,*/ /*则加入小字库数组中。返回值是汉字在HZK16中的记录号*/ int map(unsigned char QuHao,unsigned char WeiHao) { int i ; unsigned int RecNumTemp ; RecNumTemp=(QuHao-1)*94+(WeiHao-1); /*得出在HZK16中的记录号*/ for(i=0;i<HzSum;i++) { if(lay.RecNum==RecNumTemp) return lay.RecNum ; /*在小字库中已有此汉字*/ } /*在小字库数组中没有此汉字*/ lay[HzSum].QuHao=QuHao ; lay[HzSum].WeiHao=WeiHao ; lay[HzSum].RecNum=(lay[HzSum].QuHao-1)*94+(lay[HzSum].WeiHao-1); memcpy(lay[HzSum].Chinese,Chinese,sizeof(Chinese)); /*记录汉字的内码*/ HzSum++; return RecNumTemp ; } /*本函数负责提取C,CPP源程序中的字符串中使用的汉字*/ void IndexHzStr(char*str) { unsigned char QuHao,WeiHao ; unsigned char ch ; int page,length ; int MyLibRec ; static unsigned char InString=0 ; /*判断是否在字符串中的标志*/ unsigned char HalfChinese=0 ; /*判断是否是半个汉字内码的标志*/ while((ch=*str++)!='\0') { /*以"为进入和退出字符串的标志*/ if(ch=='\"')InString=!InString ; if(InString) { /*是汉字*/ if(ch>=0xa1) { if(HalfChinese==0) { QuHao=(ch-160); HalfChinese=1 ; Chinese[0]=ch ; continue ; } else { WeiHao=(ch-160); HalfChinese=0 ; Chinese[1]=ch ; map(QuHao,WeiHao); } } } } } /*本函数根据统计生成的小字库数组,排序生成.H文件。*/ /*在生成.H文件的时候,生成的.H文件的汉字点阵数组的汉字*/ /*是依据汉字在HZK16中的记录号经过排序的,这样在输出汉字时*/ /*用二分法查找汉字数组,可以大大地提高输出汉字时的速度*/ void WriteToH(void) { int i,j,k ; int Min ; long offset ; unsigned char HzDotBuffer[32]; char HeadFileStr1[8][80]= { "#if !defined(__HZ_H)", "#define __HZ_H\n", "#include \"graphics.h\"\n", "/* 汉字点阵数据的结构 */", "struct HzLib\n{", " unsigned int RecNum; /* 汉字在HZK16中的记录号 */", " unsigned char DotBuffer[32]; /* 记录汉字的点阵数据 */\n};\n", "/* 汉字点阵数据结构数组 */", } ; /*.H头文件中的数据*/ char HeadFileStr2[1][80]= { "/* 汉字字库数组中的汉字的数目 */\n", } ; /*.H头文件中的数据*/ char CFileStr1[1][80]= { "/* 本C文件包含了所有使用的汉字点阵数据 */\n", } ; /*.C文件中的数据*/ char HFuncStr[12][80]= { "/*以下是函数原形的定义*/\n", "/*使用折半查找的方法在汉字点阵数据数组中*/", "/*查找汉字并返回汉字的点阵数据。如未找到,则报警出错。*/", "/*返回1,查找成功;返回0,查找失败*/", "int GetHzDot(unsigned int RecNum,unsigned char *HzDotBuf);\n", "/* 根据汉字点阵数据数组来输出含有中英文的字符串 */", "void hzprintf(int x,int y,int maxx,int maxy,", " int dx,int dy,int Color,char *str);", "/* x,y代表输出汉字的起始位置;maxx,maxy代表输出汉字的左边界 */", "/* 和右边界;dx,dy代表输出汉字时的字间距和行间距;Color代表输出 */", "/* 汉字的颜色;str是输出的字符串数组,可以是中英文混杂的 */\n", "#endif", } ; /*函数原形的定义*/ for(i=0;i<8;i++) fprintf(fp2,"%s\n",HeadFileStr1); for(i=0;i<1;i++) fprintf(fp3,"%s\n",CFileStr1); fprintf(fp3,"#include \"%s\"\n\n",HeadFile); /*当使用的汉字超过1800个的时候,数据总量可能超过 64K,*/ /*因此使用 Huge 修饰符。*/ if(HzSum>=HugeBegin) { fprintf(fp2,"extern struct HzLib huge ArrayOfHzLib[%d];\n",HzSum); IsHuge=1 ; /*需要特别的三种编译模式*/ } else fprintf(fp2,"extern struct HzLib ArrayOfHzLib[%d];\n",HzSum); fprintf(fp3,"%s","/* 汉字点阵数据结构数组 */\n"; if(HzSum>=HugeBegin) { fprintf(fp3,"struct HzLib huge ArrayOfHzLib[%d]=\n{\n",HzSum); IsHuge=1 ; /*需要特别的三种编译模式*/ } else fprintf(fp3,"struct HzLib ArrayOfHzLib[%d]=\n{\n",HzSum); for(i=0;i<HzSum;i++) { /*把汉字点阵数组进行排序输出到.C文件中*/ Min=i ; for(j=i+1;j<HzSum;j++) { if(lay[j].RecNum<lay[Min].RecNum) Min=j ; if(Min!=i) { struct strHz strTemp ; int Size=sizeof(strTemp); memcpy(&strTemp,&lay,Size); memcpy(&lay,&lay[Min],Size); memcpy(&lay[Min],&strTemp,Size); } } /*按汉字的记录号从小到大把汉字点阵数组写入.H头文件*/ offset=(long)(lay.RecNum)*32L ; fseek(fHz,offset,SEEK_SET); fread(HzDotBuffer,32,1,fHz); fprintf(fp3," {\n %d, /*- %c%c -*/\n ", lay.RecNum,lay.Chinese[0],lay.Chinese[1]); for(k=0;k<16;k++) { fprintf(fp3,"%#4X,",HzDotBuffer[k]); } fprintf(fp3,"\n "; for(k=16;k<32;k++) { fprintf(fp3,"%#4X,",HzDotBuffer[k]); } fprintf(fp3,"\n },\n"; if((i%40)==0)putch('.'); } fprintf(fp2,"\nextern unsigned int HzSum; "; for(i=0;i<1;i++) fprintf(fp2,"%s\n",HeadFileStr2); fprintf(fp3,"};\n\nunsigned int HzSum=%u;",HzSum); fprintf(fp3,"%s"," /* 汉字字库数组中的汉字的数目 */\n"; for(i=0;i<12;i++) fprintf(fp2,"%s\n",HFuncStr); } void main(int argc,char*argv[]) { int i ; char str[macMaxLineLength]; unsigned char ch ; int ArgcNum=1 ; unsigned char FirstLine ; /* 判断是否是C程序的第一行 */ if(argc<2) { puts("\nUsage: hz2c filename"; exit(1); } for(i=0;i<macHzNum;i++) { lay.QuHao=-1 ; lay.WeiHao=-1 ; lay.RecNum=-1 ; } ; /*初始化记录数组*/ printf("\n\nCompile Chinese characters in C or CPP source to .H .C file for C,CPP\n"; fp2=fopen(HeadFile,"wb"; if(fp2==NULL) { printf("Error open %s file to creat!\n",HeadFile); exit(1); } fp3=fopen(CFile,"wb"; if(fp3==NULL) { printf("Error open %s file to creat!\n",HeadFile); exit(1); } fHz=fopen("hzk16","rb"; if(fHz==NULL) { puts("Error in open file hzk16 (UCDOS 3.0 3.1)\n"; exit(1); } /*支持通配符*和?,可以一次处理一批C或CPP源程序*/ while((ArgcNum)<argc) { fp1=fopen(argv[ArgcNum],"rt"; if(fp1==NULL) { puts("Error open .C or .CPP source file to read!\n"; exit(1); } FirstLine=1 ; /* 刚打开文件,是第一行 */ printf("\nNow Compile %s --> %s , %s\n", argv[ArgcNum],HeadFile,CFile); printf("Compile pass one!\nCompile"; i=0 ; while(!feof(fp1)) { fgets(str,macMaxLineLength-1,fp1); if(FirstLine) { if(strstr(str,HeadFile)==NULL) /* 在 C程序中尚没有 #include "hz.h" */ { char FileTempName[]="temp.$$$" ; char StrBuff[macMaxLineLength]; FILE*fTemp ; fTemp=fopen(FileTempName,"wt"; if(fTemp==NULL) { puts("Error open temp file to write!\n"; exit(1); } fprintf(fTemp,"#include \"%s\"\n\n",HeadFile); fseek(fp1,0L,SEEK_SET); while(!feof(fp1)) { fgets(StrBuff,macMaxLineLength-1,fp1); fputs(StrBuff,fTemp); } fclose(fp1); fclose(fTemp); remove(argv[ArgcNum]); rename(FileTempName,argv[ArgcNum]); fp1=fopen(argv[ArgcNum],"rt"; if(fp1==NULL) { puts("Error open .C or .CPP source file to read!\n"; exit(1); } } FirstLine=0 ; } IndexHzStr(str); if((i++%20)==0)putch('.'); } printf("\nCompile pass two!\nCompile"; WriteToH(); /*生成.H文件*/ puts("\nCompile pass three!"; fcloseall(); ArgcNum++; } printf("\nCompile ok!\t Use Chinese characters number: %d\n",HzSum); /*提示使用特别的三种编译模式*/ if(IsHuge) { printf("\n\7\7\7Chinese characters data amount is more than 64K,\n"; printf("use Compact、Large、Huge mode to compile!!\n"; } } 附:hzprintf.c 汉字英文显示程序 #include "stdio.h" #include "conio.h" #include "string.h" #include "hz.h" /*使用折半查找的方法在汉字点阵数据数组中*/ /*查找汉字并返回汉字的点阵数据。如未找到,则报警出错。*/ /*返回1,查找成功;返回0,查找失败*/ int GetHzDot(unsigned int RecNum,unsigned char*HzDotBuf) { unsigned int Low,High,Mid ; Low=0 ; High=HzSum ; /*折半法查找汉字的点阵数据*/ while(Low<=High) { Mid=(Low+High)/2 ; if(RecNum>ArrayOfHzLib[Mid].RecNum) Low=Mid+1 ; if(RecNum<ArrayOfHzLib[Mid].RecNum) High=Mid-1 ; if(RecNum==ArrayOfHzLib[Mid].RecNum) { memcpy(HzDotBuf,ArrayOfHzLib[Mid].DotBuffer,32); return 1 ; /*查找到了汉字*/ } } /*查找失败的处理*/ printf("\7\7\7\nNot find Chinese characters,please recompile your source!\n"; getch(); return 0 ; } /* 根据汉字点阵数据数组来输出含有中英文的字符串 */ void hzprintf(int x,int y,int maxx,int maxy, int dx,int dy,int Color,char*str) /* x,y代表输出汉字的起始位置;maxx,maxy代表输出汉字的左边界 */ /* 和右边界;dx,dy代表输出汉字时的字间距和行间距;Color代表输出 */ /* 汉字的颜色;str是输出的字符串数组,可以是中英文混杂的 */ { unsigned char ch ; unsigned char HalfChinese=0 ; int QuHao,WeiHao ; int x0=x ; char Buff[2]; long RecNum ; unsigned char HzDotBuf[32]; unsigned char i,j,k ; while((ch=*str++)!=0) { /*是汉字*/ if(ch>=0xa1) { if(HalfChinese==0) { QuHao=(ch-160); HalfChinese=1 ; continue ; } else { unsigned int RecNum ; WeiHao=(ch-160); HalfChinese=0 ; RecNum=(QuHao-1)*94+(WeiHao-1); GetHzDot(RecNum,HzDotBuf); /*输出汉字*/ setcolor(Color); for(i=0;i<16;i++) for(j=0;j<2;j++) for(k=0;k<8;k++) if((HzDotBuf[i*2+j])>>(7-k)&1) putpixel(x+j*8+k,y+i,Color); x+=16+dx ; } } /*处理英文字母和控制字符*/ else { /*输出可打印的英文字母*/ if(ch>=0x20&&ch<=0x7E) { setcolor(Color+1); /*英文字母换色输出*/ sprintf(Buff,"%c",ch); outtextxy(x,y+5,Buff); x+=(8+dx/2); } else { switch(ch) { case 10 : x=x0 ; /*LF=\0,换行*/ y=y+16+dy ; if(y>(maxy-16-dy)) break ; /*到了边界,退出输出*/ break ; case 13 : break ; /*CR=\n,回车*/ case 9 : x=x+32+2*dx ; break ; /*TAB=\t,制表符*/ default : break ; } } } /*中文和西文的共同的处理换行的部分*/ if((x+dx*2)>=maxx) { x=x0 ; y=y+16+dy ; if(y>(maxy-16-dy)) break ; /*到了边界,退出输出*/ } } }




从来不用别人的东西,要用,也先改成自己的再说!
2005-1-18 00:00
查看资料  发送邮件  发短消息 网志  OICQ (67154440)  编辑帖子  回复  引用回复
crshen
中级用户




积分 447
发帖 126
注册 2004-2-10
状态 离线
『第 20 楼』:  

现在考虑使用菜单驱动,请到第一页下载




从来不用别人的东西,要用,也先改成自己的再说!
2005-1-18 00:00
查看资料  发送邮件  发短消息 网志  OICQ (67154440)  编辑帖子  回复  引用回复
crshen
中级用户




积分 447
发帖 126
注册 2004-2-10
状态 离线
『第 21 楼』:  

Ghost外壳,原版本程序测试有问题,现已更新,下载链接在一楼

[此贴子已经被作者于2005-1-23 13:13:43编辑过]





从来不用别人的东西,要用,也先改成自己的再说!
2005-1-20 00:00
查看资料  发送邮件  发短消息 网志  OICQ (67154440)  编辑帖子  回复  引用回复
jiaking
中级用户




积分 223
发帖 52
注册 2004-3-7
状态 离线
『第 22 楼』:  

呵呵。楼主热心,谢谢。下来看看。再次感谢楼主的热情。


2005-1-29 00:00
查看资料  发送邮件  发短消息 网志  OICQ (53379921)  编辑帖子  回复  引用回复
sgzhou6688
中级用户





积分 231
发帖 110
注册 2008-3-24
来自 中国大陆
状态 离线
『第 23 楼』:  

下载学习学习先》》》》》》》》》》》》》》》


2010-5-18 14:11
查看资料  发送邮件  发短消息 网志  OICQ (405418144)  编辑帖子  回复  引用回复
<   <<   [1] [2]  >>
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: