⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hzk12.cpp

📁 1212汉字库.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -