📄 hzk12.cpp
字号:
// Borland C++ 3.0 (C) Copyright 1991 by Borland International
/* HZK12X.CPP */
/*
-------------------------------------------------------------------
作成日期: 2003-09-18
程序作者: zzwj5120
E-mail: zzwj5120@sina.com
文件说明: 1.C 源文件: HZK12.CPP
2.函数功能: 将文本file1.txt里所有汉字对应的点阵找出来
(要全部是汉字,不能有换行等其他非汉字符号)
3.读取的文件: HZK12 (国标一、二级12*12点阵汉字库UCDOS)
和file1.txt(文本文件,内容为汉字字符)
4.生成的文件: 默认命令行第三个参数为file12.txt,即生成文件
的名字,此文件包括file1.txt里的内容和,相对应的
汉字点阵,统计说明等,数据格式可选择C51或汇编
其它说明: 5.把函数void hanzi_view()注释掉,转换的速度会快很多.
编写目的: 1.市面上已经后很多专业的成熟的软件,提取各种字形的汉字字模,
作为给液晶和其他需要显示汉字设备的字库.出售液晶面板的厂家
也会提供提取字模的工具.出于商业目的,这些厂家和个人不会给
用户提供源代码,用户只能使用而不能学习和修改源码,会感到有些
遗憾.
2.初学者因为好奇,想多了解一点这方面的知识,而教科书里面说的不是
很详细(这些雕虫小技,谁写啊),这个程序会满足你对点阵字库方面的
好奇心和求知的愿望。
3.大学里很多学生对c语言不感兴趣,原因大都是:a.教科书太死板b.
教师照本宣科.c.大家理论学的多,实践太少.d.不知道究竟用c语言来
干什么.其中最后一条是最多的,况且我们从小到大的考试制度,对于
科教兴国产生了越来越大的制约,学习的目的渐渐的演变成位考试而
学习,这正是教育的悲哀,也是我的悲哀(我大学c语言考试不及格,
终生的遗憾啊).这里发点牢骚了.分析这个程序可以帮助你温习你
本来已掌握的c语言知识,我用了很多没用的句子,大家可以分析一下,
哪些是不必要的,本程序包括了那些方面的知识,为什么会这样. 这正
是我的最大的初衷.
4.本程序在Borland C++ 3.0里编译,C++Buile或Vc++里字长不一样
可能需要修改,我没试过.
5.我这个人很好相处的,欢迎大家和我交朋友.
--------------------------------------------------------------------
*/
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define HZDZ_LEN 24
unsigned char hzdz[HZDZ_LEN];
unsigned char line[16];
unsigned long gethzdz(unsigned int n);
void hanzi_view();
void main(int argc, char* argv[]) // access command-line arguments
{
FILE *fp1,*fp2;
union word0
{
unsigned long int ll;
struct bytes0
{
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
}st0;
}un0;
union word
{
unsigned int ab;
struct bytes
{
unsigned char a;
unsigned char b;
}st;
}un;
unsigned char ch,ch1;
unsigned int m;
//start
clrscr();
//--------------------------------------------------------------------------
//可以通过对argv[1],argv[2]赋值,指出读取的源文件的名称、创建的目标文件的名称
//argv[1]="FILE1.TXT";//source file
//argv[2]="FILE12.TXT";//create new file
//--------------------------------------------------------------------------
if (argc!=3) // test number of arguments
{ //命令行参数包括少于3个
printf("The paramers is < 3 \n");
cout<< "\nUSAGE: HZK12.EXE FILE1.TXT FILE2.TXT) \n";
cout<< "\nUse FILE1.TXT and XFILE12.TXT(DFILE12.TXT) {y/n}? \n";
ch=getch();
if((ch!='y')&&(ch!='Y'))
return;
else
{
clrscr();
argv[1]="FILE1.TXT"; //source file
//argv[2]="FILE12.TXT"; //create new file
cout<<"\nUse C51 or ASM ? Please input 'c' or 'a' \n";
ch=getch();
if(ch=='c'||ch=='C')
argv[2]="XFILE12.TXT"; //create new file
else
argv[2]="DFILE12.TXT"; //create new file
}
}
if((fp1=fopen(argv[1],"rb"))==NULL)
{
cout<<"Read FILE1.TXT error !\n"; //FILE1.TXT文件不存在或读取文件错误
cout<<"Press any key to exit!";
getch();
return;
}
if((fp2=fopen(argv[2],"rb"))==NULL) //FILE12.TXT不存在则创建新文件FILE12.TXT
{
if((fp2=fopen(argv[2],"wb"))==NULL) //建立新文件错误
{
if(ch=='c'||ch=='C')
cout<<"Creat XFILE12.TXT error!\n";
else
cout<<"Creat DFILE12.TXT error!\n";
cout<<"Press any key to exit!";
getch();
return;
}
}
else
{
clrscr();
if(ch=='c'||ch=='C')
cout<<"\nThe XFILE12.TXT already exist!\n";
else
cout<<"\nThe DFILE12.TXT already exist!\n";
cout<<"\nDo you want to delete the old target file(y/n)?"<<endl;
ch1=getch();
clrscr();
if(ch1=='y'||ch1=='Y')
{
if((fp2=fopen(argv[2],"wb"))==NULL)
{
if(ch=='c'||ch=='C')
cout<<"The XFILE12.TXT open error!\n";
else
cout<<"The DFILE12.TXT open error!\n";
cout<<"Press any key to exit!";
getch();
return;
}
}
else
{
if(ch=='c'||ch=='C')
cout<<"Please rename XFILE12.TXT !\n";
else
cout<<"Please rename DFILE12.TXT !\n";
cout<<"Press any key to exit!\n";
getch();
return;
}
}
clrscr();
if(ch=='c'||ch=='C')
cout<<"The data is C51 and the filename is XFILE12.TXT\n";
else
cout<<"The data is ASM and the fileanem is DFILE12.TXT\n";
//------------------------------------------------------
//写入汉字内码表
un.st.a=fgetc(fp1);
fputs("//说明:从 FILE1.TXT 获取汉字内码(任意自造汉字库),从UCDOS文件 HZK12 获取汉字对应点阵",fp2);
fprintf(fp2,"%c%c",0x0d,0x0a);
if(ch=='c'||ch=='C') //写入C51格式的汉字内码表
{
fprintf(fp2,"//汉字内码表:");
fprintf(fp2,"%c%c",0x0d,0x0a);
fprintf(fp2,"uchar code hznm [ ][ 2] = {");
fprintf(fp2,"%c%c",0x0d,0x0a);
int i=0;
int j=0;
for(;!feof(fp1);i++)
{
if(!(i%120))
{
fprintf(fp2,"\"");
j++;
}
fputc(un.st.a,fp2);
un.st.a=fgetc(fp1);
if((i%120)==119)
{
fprintf(fp2,"\"%c%c",0x0d,0x0a);
}
}
fprintf(fp2,"\"};");
fprintf(fp2,"%c%c",0x0d,0x0a);
if(!(i%120))
{
fprintf(fp2,"//每行60个汉字,共%d行 ",j,(i%120)/2);
fprintf(fp2,"总计%d*%d=%d个汉字 测试累加值为 %d",j,60,(j*60),i/2);
}
else
{
fprintf(fp2,"//最后一行除外每行60个汉字,共%d行,最后一行%d个汉字 ",j,(i%120)/2);
fprintf(fp2,"总计(%d*%d)+%d=%d个汉字 测试累加值为 %d",j-1,60,(i%120)/2,((j-1)*60)+(i%120)/2,i/2);
}
fprintf(fp2,"%c%c",0x0d,0x0a);
}
else //写入汇编语言格式的汉字内码
{
fprintf(fp2,";汉字内码表,每行最多8个汉字:");
fprintf(fp2,"%c%c",0x0d,0x0a);
fprintf(fp2,"hznm_addr:");
unsigned int i=0;//总共多少字节汉字
unsigned int j=0;//第几行
int t;//统计最后一行汉字个数
do
{
if(!(i%16))
{
t=0;
fprintf(fp2,"%c%cDB 0%0.2XH",0x0d,0x0a,un.st.a);
j++;
}
else if((i%16)==15)
{
fprintf(fp2,"0%0.2XH;",un.st.a);
fseek(fp1,-16L,1); //文件指针往前移动16字节
for(int k=0;k<16;k++)
fputc(fgetc(fp1),fp2); //把刚才写入的8个汉字注释出来
un.st.a=fgetc(fp1);
i++;
t++;
if(feof(fp1))
break;
else
continue;
}
else
{
fprintf(fp2,"0%0.2XH",un.st.a);
}
un.st.a=fgetc(fp1);
i++;
t++;
if(!feof(fp1))
{
fprintf(fp2,",");
}
if(feof(fp1))
{
long ll0=0;
ll0=t;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -