資源簡介
點陣輸出漢字,用漢字字庫輸出放大的漢字,漢字字庫,c++

代碼片段和文件信息
//?HanZi.cpp?:?Defines?the?entry?point?for?the?console?application.
//
#include?“stdafx.h“
#include?“stdio.h“
#include?“stdlib.h“
#include?“conio.h“
#include?“string.h“
/*
??從鍵盤獲得漢字的編碼
??在中文windows下,默認編碼方式為GB2312?每個漢字由兩個字節組成。
??函數的目的是:把這個漢字的高字節寫入?pc1指向的位置,低字節寫入?pc2指向的位置
*/
int?get_han_zi(unsigned?char*?pc1?unsigned?char*?pc2)
{
char?buf[100];
printf(“\n請輸入一個漢字:“);
gets(buf);
if(strlen(buf)?!=?2)?return?-1;
*pc1?=?buf[0];
*pc2?=?buf[1];
if(*pc1?0xa1)?return?-2;
if(*pc2?0xa1)?return?-2;
return?0;
}
/*
??從文件(字形文件HZK16)把字形裝入到一個32字節的緩沖區?buf?中。
??c1?是該漢字GB2312編碼的高字節,c2是低字節。
??每個bit代表1個像素點,16點陣的字模需要256個像素點信息,故需32字節
??字節的排列與16點陣像素的對應關系如下圖:
??
??第0字節?第1字節
??第2字節?第3字節
??.......
??第14字節?第15字節
??也就是說:每1行的16個點由2個字節提供。順序是:從上到下,從左到右。
??GB2312的編碼規則是:前一個字節表示區號,后一個表示區中的偏移序號。
??每個區有94個漢字。區號和序號的編碼都是從?0xA1開始(為了避免和西文沖突)
??因此,已知某個漢字的編碼,就可以計算出文件中所在的絕對位置。
*/
void?load_han_zi(unsigned?char*?buf?unsigned?char?c1?unsigned?char?c2)
{
int?n?=?(c1?-?0xa1)?*?94?+?(c2?-?0xa1);?//?計算在文件中的位置
FILE*?fp?=?fopen(“HZK16.DAT“?“rb“);
if(fp==NULL){
printf(“漢字庫打開錯!“);
exit(1);
}
fseek(fp?n?*?32L?SEEK_SET);
for(int?i=0;?i<32;?i++){
buf[i]?=?(unsigned?char)fgetc(fp);
}
fclose(fp);
}
/*
??顯示漢字
??buf:?從文件中讀出的漢字字模信息,32字節,說明同上
??italic:?=1,如果要求斜體,?=0?正常
??kx:?水平放大率
??ky:?垂直放大率
??fill:?用于填充的字符
*/
void?show_han_zi(unsigned?char*?buf?int?italic?int?kx?int?ky?char?fill)
{
printf(“\n?.....................請考生完成!\n“);
int?ikjlh;
unsigned?char?chtemp;
for(i=0;?i<16;?i++)//16行
for(h=0;?h {
if(italic)//斜體
for(k=0;?k<(15-i);?k++)
printf(“?“);
for(l=0;?l<2;?l++)//每行兩個字節
{
ch=buf[2*i+l];
for(j=0;?j<8;?j++)
{
temp=ch?&?0x80;???//temp的最高位等于ch的最高位其他位全為0
ch=ch<<1;???//ch左移一位
for(k=0;?k if(temp==0x80)???//如果temp的最高位為1輸出填充字符
printf(“%c“fill);
else
printf(“?“);
}
}
printf(“\n“);
}
}
/*
??與屏幕的輸出類似.
??只是寫入到一個名字為?a.txt?的文件中
*/
void?write_to_file(unsigned?char*?buf?int?italic?int?kx?int?ky?char?fill)
{
printf(“\n?考生也可完成之,不要求!\n?“);
FILE*?fp?=?fopen(“a.txt“?“w“);
if(fp==NULL){
printf(“文件打開出錯“);
exit(1);
}
int?ikjlh;
unsigned?char?chtemp;
for(i=0;?i<16;?i++)//16行
for(h=0;?h {
if(italic)//斜體
for(k=0;?k<(15-i);?k++)
fputc(‘?‘fp);
for(l=0;?l<2;?l++)//每行兩個字節
{
ch=buf[2*i+l];
for(j=0;?j<8;?j++)
{
temp=ch?&?0x80;???//temp的最高位等于ch的最高位其他位全為0
ch=ch<<1;???//ch左移一位
for(k=0;?k if(temp==0x80)???//如果temp的最高位為1輸出填充字符
fputc(fillfp);
else
fputc(‘?‘fp);
}
}
fputc(‘\n‘fp);
}
fclose(fp);
}
int?set_zoom_k(int*?pk)
{
printf(“請輸入放大率(1-4):“);
char?buf[100];
gets(buf);
int?n?=?atoi(buf);
if(n<1?||?n>4)?return?-1;
*pk?=?n;
return?0;
}
char?get_fill_char()
{
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4224??2010-04-26?23:33??點陣輸出漢字\a.txt
?????文件?????188486??2010-04-26?23:32??點陣輸出漢字\Debug\HanZi.exe
?????文件?????336076??2010-04-26?23:32??點陣輸出漢字\Debug\HanZi.ilk
?????文件??????14885??2010-04-26?23:32??點陣輸出漢字\Debug\HanZi.obj
?????文件?????228200??2010-04-24?23:43??點陣輸出漢字\Debug\HanZi.pch
?????文件?????492544??2010-04-26?23:32??點陣輸出漢字\Debug\HanZi.pdb
?????文件??????41984??2010-04-26?23:32??點陣輸出漢字\Debug\vc60.idb
?????文件??????53248??2010-04-26?23:32??點陣輸出漢字\Debug\vc60.pdb
?????文件???????5317??2010-04-26?23:32??點陣輸出漢字\HanZi.cpp
?????文件???????3389??2010-04-24?00:32??點陣輸出漢字\HanZi.dsp
?????文件????????518??2010-04-24?00:34??點陣輸出漢字\HanZi.dsw
?????文件??????58368??2010-04-26?23:34??點陣輸出漢字\HanZi.ncb
?????文件??????48640??2010-04-26?23:34??點陣輸出漢字\HanZi.opt
?????文件???????1173??2010-04-26?23:32??點陣輸出漢字\HanZi.plg
?????文件?????267616??1998-09-06?07:20??點陣輸出漢字\HZK16.DAT
?????文件???????1202??2010-04-12?15:55??點陣輸出漢字\ReadMe.txt
?????文件????????292??2010-04-12?15:55??點陣輸出漢字\StdAfx.cpp
?????文件????????667??2010-04-12?15:55??點陣輸出漢字\StdAfx.h
?????文件???????1115??2010-04-26?23:37??點陣輸出漢字\問題描述.txt
?????目錄??????????0??2010-04-26?23:35??點陣輸出漢字\Debug
?????目錄??????????0??2010-04-26?23:37??點陣輸出漢字
-----------?---------??----------?-----??----
??????????????1747944????????????????????21
評論
共有 條評論