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

📄 hzk16x.cpp

📁 一个提取国标汉字的C源码文件
💻 CPP
字号:
// Borland C++ 3.0- (C) Copyright 1991 by Borland International

/* HZK16X.CPP */
/*
-------------------------------------------------------------------
作成日期:
		2003-09-14 

程序作者:
		zzwj5120
E-mail:   
		zzwj5120@sina.com

文件说明:

1.C 源文件:
		HZK16X.CPP
		gethzdz.cpp
2.函数功能:
		将文本file1.txt里所有汉字对应的点阵找出来
		(要全部是汉字不能有换行等其他非汉字符号)

3.读取的文件:
		HZK16    (16*16点阵GB2312汉字库UCDOS)
		file1.txt(文本文件,想要找这些汉字的点阵)

4.生成的文件:
		file2.txt(提取的汉字点阵,附有统计说明,提取位置等)
		点阵的格式是C51格式
--------------------------------------------------------------------
*/
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include "gethzdz.cpp"
unsigned long gethzdz(unsigned int n);
extern unsigned char hzdz[32];
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;
	unsigned char line[16];
	union word
	{
		unsigned int ab;
		struct bytes
		{
			unsigned char a;
			unsigned char b;
		}st;
	}un;
	unsigned int  ch,i,m,k;
	//start
	clrscr();
	argv[1]="FILE1.TXT";//source file
	argv[2]="FILE2.TXT";//create new file

	if (argc!=3)      // test number of arguments
	{
		printf("the paramers is < 3 \n");
		cout<< "USAGE: HZKDEMO.EXE FILE1.TXT FILE2.TXT \n";
		getch();
		//return;
	}

	if((fp1=fopen(argv[1],"rb"))==NULL)
	{
		cout<<"read FILE1.TXT error !";
		getch();
		return;
	}
	if((fp2=fopen(argv[2],"rb"))==NULL)
	{
		if((fp2=fopen(argv[2],"wb"))==NULL)
		{
			cout<<"creat FILE2.TXT error!";
			getch();
			return;
		}
	}
	else
	{
		cout<<"the FILE2.TXT already exist!";
		cout<<"Do you delete target file(y/n)?"<<endl;
		ch=getch();
		if(ch=='y'||ch=='Y')
		{
			if((fp2=fopen(argv[2],"wb"))==NULL)
			{
				cout<<"the FILE2.TXT open error!";
				getch();
				return;
			}
		}
		else
			return;
	}

	clrscr();
	un.st.b=fgetc(fp1);
	un.st.a=fgetc(fp1);
	//-----------------------------------------------------
	//view
	//printf("\nread FILE1.TXT:  ");
	//printf("un.st.b = %x  un.st.a = %x ",un.st.b,un.st.a);
	//printf("un.ab = %x",un.ab);
	//getch();
	//------------------------------------------------------
	fputs("//说明:从 FILE1.TXT 获取汉字内码,从UCDOS文件 HZK16 获取汉字对应点阵",fp2);
	fprintf(fp2,"%c%chzdzcode = {%c%c",0x0d,0x0a,0x0d,0x0a);
	m=0;
	while(1)
	{
		if(feof(fp1))
		{
			cout<<"the FILE1.TXT have finished!\n";
			getchar();
			break;//汉字文件结束
		}
		un0.ll=gethzdz(un.ab);
		m++;
		if(un0.ll==0xb020)
			break;//读HZK16文件到结尾
		//------------------------------------------------------
		//屏幕显示部分
		for(i=0;i<32;)
		{
			for(char j=0;j<8;j++)
			{
				k=7-j;
				line[j]=(hzdz[i])>>k;
				line[j]&=0x01;
			}
			i++;
			for(;j<16;j++)
			{
				k=15-j;
				line[j]=(hzdz[i])>>k;
				line[j]&=0x01;
			}
			i++;
			for(j=0;j<16;j++)
			{
				if(line[j])
					printf("o",line[j]);
				else
					printf(" ");
			}
			cout<<endl;
		}
		//-----------------------------------------------------------------------
		fgetc(fp1);
		//写入文件部分,点阵数据
		for(i=0;i<31;i++)
		{
			fprintf(fp2,"0x%.2x%c",hzdz[i],',');
		}
		if(feof(fp1))
		{
			fprintf(fp2,"0x%.2x}",hzdz[i]);
		}
		else
			fprintf(fp2,"0x%.2x%c",hzdz[i],',');
		//------------------------------------------------
		//写入文件部分,注释说明
		fprintf(fp2,"%c%c",0x0d,0x0a);//回车
		fprintf(fp2,"//%c%c (%c%c%d%c%c)",un.st.b,un.st.a,0xb5,0xda,m,0xb8,0xf6);//32字节点阵对应的汉字,汉字在文本中的序号
		fprintf(fp2,"%c%c",0x0d,0x0a);
		fprintf(fp2,"//position = %d%d%d",un0.st0.d,un0.st0.c,un0.st0.b);//汉字在HZK16中的字节位置
		fprintf(fp2,"%dH BYTE",un0.st0.a);
		fprintf(fp2,"%c%c",0x0d,0x0a);
		fprintf(fp2,"//         = 32*((FIRST-0xA1)*94+(SECOND-0xA1))");//字节位置的计算公式
		fprintf(fp2,"%c%c",0x0d,0x0a);
		///------------------------------------------------------------------------
		//view 观察
		printf("\ntotal  m = %d",m);
		printf("\nposition = %x",un0.st0.d);
		printf("%x",un0.st0.c);
		printf("%x",un0.st0.b);
		printf("%xH BYTE\n	 = 32*((FIRST-0xA1)*94+(SECOND-0xA1))\n",un0.st0.a);
		cout<<"\ncontinue(y/n)?\n";
		/*
		ch=getch();
		if(ch=='n'||ch=='N')
			break;
		*/
		if(m==8000)
			break;
		fseek(fp1,-1,1);
		un.st.b=fgetc(fp1);
		un.st.a=fgetc(fp1);
	}
	fclose(fp1);
	fclose(fp2);
	return;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -