分类:
2006-11-17 09:00:19
采用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) |
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
#include ″string.h″
#include
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
#include
#include
#include″stdlib.h″
#include″math.h″
#include″fcntl.h″
#include
#include
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);}
}