汉字字库

采用C和C++文件函数自定义小型汉字库实例

罗跃惠

1 C和C++文件函数

  C或C++都提供了两类关于文件的函数,一类是标准文件函数,另一类是非标准文件函数。标准文件函数,即有缓冲区的输入和输出(Buffered I/O),又称高级磁盘输入输出(高级I/O)。非标准文件函数,即无缓冲区的输入和输出(Unbuffered I/O),又称低级输入和输出(低级I/O),表示输入和输出的动作是直接在磁盘内执行读写信息的动作。
  对这两种文件操作,C和C++是放在不同库中。C和C++标准文件函数是包含在stdio.h文件中,而非标准文件函数是包含在fcntl.h文件内,所以在使用这两类函数时必须区别调用。
1.1 标准文件函数
  标准文件函数主要包括文件的打开、关闭、读写等。其主要功能如表1所示。

表1 标准文件函数功能表

函数名称功能说明
fopen()打开文件FILE*fopen(char*filename,*mode)
fclose()关闭文件int fclose(FILE*fp)
fputc()把字符输出到指定文件int fputc(char ch, FILE*fp)
fgetc()从指定的文件中取得字符int fgetc(FILE*fp)
fputs()把字符串输出到指定文件中int fputs(char*str, FILE*fp)
fgets()从指定文件中读取字符串int gets(char*str, in n, FILE*fp)
fprntf()按格式将数据写到指定的文件中fprintf(FILE*fp,char *format)
fscanf()从指定的文件按格式输入数据int fscan(FILE*fp, char*format)
feof()检测文件是否结束int feof(FILE*fp)
fseek()改变文件指针位置int fseek(FILE*fp,long offset,int base
fread()从指定文件中读取数据项int fread(char*pt,unsigned size,unsigned n,FILE*fp)
rewind()设定文件起始位置void rewind(FILE*fp)
  其中打开文件的操作类型(mode)规定为:“r”为打开文件只读;“w”为建立文件只写;“a”为增补,如文件中存在则建立;“r+”为打开文件读写;“w+”为建立文件读写;“a+”为打开或建立文件增补;“b”为二进制文件;“t”为ASCⅡ码文件(系统默认)。
1.2 非标准文件函数
  非标准文件函数主要包括文件的打开、关闭,读写等,其主要功能如表2所示。

表2 非标准文件函数功能表

函数名称功能说明
creat()建立一个原来不存在的文件int cread(char *filename,int mode)
open()打开已有文件int open(char *filename,int mode)
close()关闭已打开的文件int close(int fp)
read()从指定文件读入数据存入指定区域int read(int fd,char *buf unsigned count)
write()把指定区域数据写入指定文件int write(int fd,char *buf,unsigned count)
lseek()移动文件位置指针int lseek(int fd,long offset,int frimwhile)
 其中打开文件的操作类型(mode)规定为:“0”——建立只读文件;“1”——建立只写文件;“2”——建立读写文件。

2 两类文件函数在汉字字库中的使用

2.1 点阵字库的组成
  根据国家标准GB2312-80规定的区码和位码输入汉字,汉字是用2个字节的区位码存放在计算机中,高字节为区码,低字节为位码,每个区有94个汉字。从15区开始为汉字,前面有9个区为特殊符号。汉字的点阵字库也是按区位码的结构来放置汉字点阵的。如24点阵字库是由24×24个点组成。一个字节可以表示8个字形点,共需3×24=72字节。若已知某汉字区码为C1,位码为C2,那么此汉字字形在24点阵字库中位置以[(C1-15)×94+ C2]×72为首地址开始的72字节。
2.2 自定义小型汉字库实例
  采用上述方法,笔者自定义一个小型汉字库,由区位码读取24点阵汉字并直接在显示器上显示。
  在程序1中,使用标准文件函数(缓冲区),在UCDOS5.0汉字HZK.24F中取得6个汉字(淮南工业学院)的字模,建立自定义的小型汉字库HZK.24。在程序2中,使用非标准文件函数,读取HZK.24中汉字字模,显示在屏幕上,并且可旋转、放大和倾斜。
   /*程序1*/
/*自定义小型24点阵汉字库*/
/*由ucdosHZK24f采集*/
/*使用标准文件函数*/
#include <stdio.h>
#include ″string.h″
#include <string.h>
void main()
 {
 FILE *fp1.*fp2;
unsigned char c, *p=″淮南工业学院″;
 unsigned char i1,i2,c1,c2;
 int rec,j,i;
 float 1;
 /*ucdos汉字操作系统24点阵字库*/
 fp1=fopen(″hzk24f″,″rb″);
  if(fp1==0)
  {cputs(″Error on open hzk24f!″);
  exit(1);}
 /*自定义小型24点阵字库HZK.24*/
 fp2=fopen(″HZK.24″,″wb″);
   while(*p!)=0)
 {.i1=*p+ +;
  i2=*p+ +;
  c1=(i1-Oxa1)&Ox7f;
  c2=(i2-Oxa1)&Ox7f;
    rec=(c1-15)*94+c2;
    1=rec*72L;
    fseek(fp1,1,SEEK-SET);
    for(j=1;j<=72;j+ +){
    c=fgetc(fp1);
    fputc(c,fp2);
     }
  }
 fclose(fp1);
 fclose(fp2);
 }
   /*程序2*/
/*使用自定义小型24点阵汉字库*/
/*HZK.24*/
/*使用标准文件函数*/
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include″stdlib.h″
#include″math.h″
#include″fcntl.h″
#include<string.h>
#include<io.h>
int ff24;
int j;
float f[9]={0,1,2,3,4,5,6,7,8};
void main()
{
int a;
int driver=DETECT,mode;
initgraph(&driver,&mode,″″);
ff24=open(″HZK.24″,0);
if (ff24==-1)
  {printf(″Error on open hzk.24″);
exit(1);
}
for (j=0;j<6;j+ +){
  puthz24(200,80,j*72L,18);}
  getch();close(ff24);closegraph();
exit(0);
}
int puthz24(x,y,z,color)
int x,y,color;
long z;
{
 unsigned int i,c1,c2;
 int i1,
 i2,i3,i4,i5,rec,r,co;
long l;
unsigned char by[72];
lseek(ff24,z,0);
read(ff24,by,72);
for (i1=0;i1<24;i1+ +)
  for (i2=0;i2<3;i2+ +)
    for (i3=0;i3<8;i3+ +)
    if (by[i1*3+i2](7-i3)&1)
{ r=x+i1+j*24;co=y+i2*8+i3;
    putpixel(r,co,color);}
}

转自:http://blog.chinaunix.net/u/19671/showart.php?id=201961

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值