为什么我从hzk16文件导出的数据会是乱码?
#include "stdio.h"<br />main()<br />{ int c;<br /> FILE *p1,*p2;<br /> p1=fopen("HZK16","r");<br /> p2=fopen("new.txt","w");<br /> c=getc(p1);<br /> while(c!=EOF)<br /> {<br /> putc(c,p2);<br /> c=getc(p1);<br /> }<br /> fclose(p1);<br /> fclose(p2);<br />}<br />我现在有一文件HZK16,以上就是我的程序!<br />为什么我从hzk16文件导出的数据会是乱码?<br />我想取该文件里面常用汉字字模存到一个ROM中!!!!<br /> <br />^_^哈
读UCDOS显示字库的程序<br /><br />#include<mmsystem.h> //Project菜单/Settings/Progect Settings /Link / Object/Library Modules 加入Winmm.lib<br /> //通用控制 则加入COMCTL32.LIB<br /><br /><br />/******************************************************************<br /> 从UCDOS的字库文件取得字模<br /> 李方君(bzyy@21cn.com)<br /> ASCII字模从ASC16文件中<br /> 汉字从HZK16文件中取得<br /><br />后面的显示部分没有用,只是验证读出的数据是否正确【已经调试通过】<br />******************************************************************/<br /><br />//全局变量定义<br />#define ZM_CACHE_LONG 16384 //字模文件缓冲<br /><br />#define ASC16NAME "asc16"<br />#define HZK16NAME "hzk16"<br /><br />//char szFileName ; //完整的驱动器,路径,加文件名<br />//char szTitleName ;//文件名本身<br /><br />HMMIO m_hZM_ASC16;<br />HMMIO m_hZM_HZK16;<br /><br />//unsigned char cAsc16Cache;<br />//unsigned char cHzk16Cache;<br /><br />unsigned char asczm;<br />unsigned char hzkzm;<br />/*************/<br />//文件I/O<br />/*************/<br />BOOL OpenZMFile ()<br />{<br /> m_hZM_ASC16 = mmioOpen(ASC16NAME,NULL,MMIO_READ | MMIO_COMPAT | MMIO_ALLOCBUF );<br /> m_hZM_HZK16 = mmioOpen(HZK16NAME,NULL,MMIO_READ | MMIO_COMPAT | MMIO_ALLOCBUF );<br /><br /> if (m_hZM_ASC16 == NULL || m_hZM_ASC16 == NULL)<br /> {<br /> return false;<br /> }<br /><br /> return true;<br />}<br /><br />BOOL CloseZMFile ()<br />{<br /> mmioClose(m_hZM_ASC16,MMIO_FHOPEN);<br /> mmioClose(m_hZM_HZK16,MMIO_FHOPEN);<br /> return true;<br />}<br /><br />BOOL GetZM_ASC16(unsigned char asciinum, unsigned char * zmbuf)<br />//ASCII码值 16字节字模缓冲区(ASCII字模是8×16结构的)<br />{<br /> int startpoit; //字符首地址<br /> startpoit = asciinum * 16;<br /> mmioSeek (m_hZM_ASC16 , startpoit , SEEK_SET);//字模位置定位<br /> mmioRead (m_hZM_ASC16 , (char *)zmbuf , 16);<br /> return true;<br />}<br /><br />BOOL GetZM_HZK16(unsigned char * hznum, unsigned char * zmbuf)<br />{<br />// unsigned char hz[] = "李";<br /> int qm,wm,startpoit;<br /> qm= hznum; /*通过区位码计算其在hzk16f文件中的偏移地址*/<br /> qm=qm-161;<br /> if (qm>87) return false;<br /> wm=hznum;<br /> wm=wm-161;<br /> if (wm>94) return false;<br /> startpoit=((long) qm * 94 + wm ) * 32;<br /> mmioSeek (m_hZM_HZK16,startpoit,SEEK_SET);//定位<br /> mmioRead (m_hZM_HZK16,(char *)zmbuf , 32); //16*16点阵对应32个字节<br /><br /> return true;<br />}<br /><br /><br /><br />/*///////////////////////////////////<br />试验性显示,用于验证读出的数据是否正确<br />///////////////////////////////////*/<br /><br />#define rgbGRIDDING RGB(34,19,172) //网格色<br />#define rgbZMDOT RGB(150,150,160) //字模点阵色<br />#define rgbBACK RGB(255,0,0) //点底色<br /><br />HPEN colGridding ; //网格色<br />HPEN colZMdot; //字模点阵色<br />HBRUSH hZMBrush;<br /><br />void DrawInit()<br />{<br /> colGridding = CreatePen(PS_SOLID,1,rgbGRIDDING);//网格色PS_DOT<br /> colZMdot = CreatePen(PS_SOLID,1,rgbZMDOT); //字模点阵色<br /> hZMBrush = CreateSolidBrush(rgbBACK);<br /> return;<br />}<br /><br />void DrawGridding(HDC hdc,int startx,int starty,int wn,int hn,int r = 4)<br />//画网格 左上角起始坐标 每行格子数 每列格子数 格子内宽(即不含边线的宽)<br />{<br /> int topx = startx,topy = starty,<br /> bottomx = startx + wn * (r + 1),bottomy = starty + hn * (r + 1); //格子现宽为1<br /> int i,wkx,wky;<br /> <br /> SelectObject(hdc,colGridding);<br /><br /> for(i = 0 ; i < wn + 1 ; i ++) //画列线<br /> {<br /> wkx = topx + i * ( r + 1 );//计算每根列线横座标<br /> MoveToEx( hdc , wkx,topy , NULL ) ;<br /> LineTo(hdc, wkx, bottomy);<br /> }<br /><br /> for(i = 0 ; i < hn + 1 ; i ++) //画行线<br /> {<br /> wky = topy + i * ( r + 1 );//计算每根行线纵座标<br /> MoveToEx( hdc , topx,wky , NULL ) ;<br /> LineTo(hdc, bottomx , wky);<br /> }<br /><br /> return;<br />}<br /><br />void DrawFillBox(HDC hdc,int stx,int sty ,int r = 4)<br />//填充格子 (包含左边列线)<br />{<br /> SelectObject(hdc,hZMBrush);<br /> SelectObject(hdc,colZMdot);<br /> Rectangle(hdc,stx + 1,sty + 1,stx + 1 + r,sty + 1 + r);//画矩形<br /> return;<br />}<br /><br />void DrawByteLine(HDC hdc, unsigned char db, int stx, int sty ,int r = 4)<br />//画一个字节 字节 起始坐标(包含左边列线) 点宽<br />{<br /> int wkx,wky;<br /> wkx = stx ; //第一个点画位置(包含左边列线)<br /> wky = sty ; //同上<br /> int k;<br /><br /> unsigned char wtest = 128; //从第一位起<br /> for (k = 0 ; k < 8 ; k ++) //测试每位的有无<br /> {<br /> if (wtest & db) <br /> DrawFillBox(hdc,wkx,wky,r);<br /> wtest = wtest / 2;<br /> wkx = wkx + r + 1 ;//横坐标自增<br /> }<br /> return;<br />}<br /><br />BOOL DrawAsc16(HDC hdc, unsigned char * zmbuf, int stx, int sty , int r = 4)<br />{<br /> int wkx,wky;<br /> wkx = stx ; //第一个点画位置(包含左边列线)<br /> wky = sty ; //同上<br /> int i;<br /><br /> for (i = 0 ; i < 16 ; i ++) //每个ASCII字模有16个字节<br /> {<br /> DrawByteLine(hdc,zmbuf,wkx,wky,r);<br /> wky = wky + r +1;<br /> }<br /><br /> return true;<br />}<br /><br />BOOL DrawHzk16(HDC hdc, unsigned char * zmbuf, int stx, int sty , int r = 4)<br />{<br /> int wkx,wky;<br /> wkx = stx ; //第一个点画位置(包含左边列线)<br /> wky = sty ; //同上<br /> int i;<br /><br /> for (i = 0 ; i < 32 ; i ++) //每个HZK16字模有32个字节 分成16行<br /> {<br /> DrawByteLine(hdc,zmbuf,wkx,wky,r); //一行的第一个字节<br /> i ++;<br /> DrawByteLine(hdc,zmbuf,wkx + 8 * (r + 1),wky,r); //一行的第二个字节<br /> wky = wky + r +1;<br /> }<br /><br /> return true;<br />}<br /><br />BOOL ZMPreview(HDC hdc, int x,int y )<br />{<br /> MoveToEx( hdc , x,y , NULL ) ;//定位线<br /> LineTo(hdc, x-10, y);<br /> MoveToEx( hdc , x,y , NULL ) ;<br /> LineTo(hdc, x, y-10);<br /><br /> int zmr = 10;//字模点阵宽<br /> DrawGridding(hdc,x,y,16,16,zmr);<br /> //DrawAsc16(hdc,asczm , x, y ,zmr); //a1<br /> DrawHzk16(hdc,hzkzm , x, y ,zmr);<br /><br /> //DrawByteLine(hdc, 201, x, y,zmr);//测试单字节显示<br /> //unsigned char a1 = {170,0,170,201,170,201,0,0,170,201,170,201,0,0,170,201};<br /> <br /> return true;<br />}用"rb"
p1=fopen("HZK16","rb");
页:
[1]