汉字字库
采用C和C++文件函數(shù)自定義小型漢字庫實例
羅躍惠
1 C和C++文件函數(shù)
C或C++都提供了兩類關(guān)于文件的函數(shù),一類是標準文件函數(shù),另一類是非標準文件函數(shù)。標準文件函數(shù),即有緩沖區(qū)的輸入和輸出(Buffered I/O),又稱高級磁盤輸入輸出(高級I/O)。非標準文件函數(shù),即無緩沖區(qū)的輸入和輸出(Unbuffered I/O),又稱低級輸入和輸出(低級I/O),表示輸入和輸出的動作是直接在磁盤內(nèi)執(zhí)行讀寫信息的動作。
對這兩種文件操作,C和C++是放在不同庫中。C和C++標準文件函數(shù)是包含在stdio.h文件中,而非標準文件函數(shù)是包含在fcntl.h文件內(nèi),所以在使用這兩類函數(shù)時必須區(qū)別調(diào)用。
1.1 標準文件函數(shù)
標準文件函數(shù)主要包括文件的打開、關(guān)閉、讀寫等。其主要功能如表1所示。
表1 標準文件函數(shù)功能表
| 函數(shù)名稱 | 功能說明 |
| fopen() | 打開文件FILE*fopen(char*filename,*mode) |
| fclose() | 關(guān)閉文件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() | 按格式將數(shù)據(jù)寫到指定的文件中fprintf(FILE*fp,char *format) |
| fscanf() | 從指定的文件按格式輸入數(shù)據(jù)int fscan(FILE*fp, char*format) |
| feof() | 檢測文件是否結(jié)束int feof(FILE*fp) |
| fseek() | 改變文件指針位置int fseek(FILE*fp,long offset,int base |
| fread() | 從指定文件中讀取數(shù)據(jù)項int fread(char*pt,unsigned size,unsigned n,FILE*fp) |
| rewind() | 設(shè)定文件起始位置void rewind(FILE*fp) |
| 其中打開文件的操作類型(mode)規(guī)定為:“r”為打開文件只讀;“w”為建立文件只寫;“a”為增補,如文件中存在則建立;“r+”為打開文件讀寫;“w+”為建立文件讀寫;“a+”為打開或建立文件增補;“b”為二進制文件;“t”為ASCⅡ碼文件(系統(tǒng)默認)。 1.2 非標準文件函數(shù) 非標準文件函數(shù)主要包括文件的打開、關(guān)閉,讀寫等,其主要功能如表2所示。 表2 非標準文件函數(shù)功能表 |
| 函數(shù)名稱 | 功能說明 |
| creat() | 建立一個原來不存在的文件int cread(char *filename,int mode) |
| open() | 打開已有文件int open(char *filename,int mode) |
| close() | 關(guān)閉已打開的文件int close(int fp) |
| read() | 從指定文件讀入數(shù)據(jù)存入指定區(qū)域int read(int fd,char *buf unsigned count) |
| write() | 把指定區(qū)域數(shù)據(jù)寫入指定文件int write(int fd,char *buf,unsigned count) |
| lseek() | 移動文件位置指針int lseek(int fd,long offset,int frimwhile) |
2 兩類文件函數(shù)在漢字字庫中的使用
2.1 點陣字庫的組成
根據(jù)國家標準GB2312-80規(guī)定的區(qū)碼和位碼輸入漢字,漢字是用2個字節(jié)的區(qū)位碼存放在計算機中,高字節(jié)為區(qū)碼,低字節(jié)為位碼,每個區(qū)有94個漢字。從15區(qū)開始為漢字,前面有9個區(qū)為特殊符號。漢字的點陣字庫也是按區(qū)位碼的結(jié)構(gòu)來放置漢字點陣的。如24點陣字庫是由24×24個點組成。一個字節(jié)可以表示8個字形點,共需3×24=72字節(jié)。若已知某漢字區(qū)碼為C1,位碼為C2,那么此漢字字形在24點陣字庫中位置以[(C1-15)×94+ C2]×72為首地址開始的72字節(jié)。
2.2 自定義小型漢字庫實例
采用上述方法,筆者自定義一個小型漢字庫,由區(qū)位碼讀取24點陣漢字并直接在顯示器上顯示。
在程序1中,使用標準文件函數(shù)(緩沖區(qū)),在UCDOS5.0漢字HZK.24F中取得6個漢字(淮南工業(yè)學院)的字模,建立自定義的小型漢字庫HZK.24。在程序2中,使用非標準文件函數(shù),讀取HZK.24中漢字字模,顯示在屏幕上,并且可旋轉(zhuǎn)、放大和傾斜。
/*程序1*/
/*自定義小型24點陣漢字庫*/
/*由ucdosHZK24f采集*/
/*使用標準文件函數(shù)*/
#include <stdio.h>
#include ″string.h″
#include <string.h>
void main()
{
FILE *fp1.*fp2;
unsigned char c, *p=″淮南工業(yè)學院″;
unsigned char i1,i2,c1,c2;
int rec,j,i;
float 1;
/*ucdos漢字操作系統(tǒng)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*/
/*使用標準文件函數(shù)*/
#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);}
}
轉(zhuǎn)自:http://blog.chinaunix.net/u/19671/showart.php?id=201961
總結(jié)
- 上一篇: pandas中category类型的数据
- 下一篇: Cocos Creator实现FPS经典