📄 hzk16x.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 + -