Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1427018
  • 博文数量: 430
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4388
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:04
文章存档

2013年(1)

2008年(2)

2007年(14)

2006年(413)

分类:

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)
 其中打开文件的操作类型(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
#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);}
}

阅读(2514) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~