资源简介
点阵输出汉字,用汉字字库输出放大的汉字,汉字字库,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
评论
共有 条评论