功能分析
现有包括郑码与拼音的一个词典TXT文件(incode.txt)共十万行内容,我们需要对郑码词典部分(也就是前58031行内容)进行内容提取。将中文只有一个字的内容进行整行提取,写入一个新的TXT文件(in.txt)中。
文本构成的格式是 郑码以及拼音的编码+空格+对应的汉字。下面给出部分文本实现的情况:
①操作前的 incode.txt 内容:
%---------------------------------------------
aagn 无可奈何 无恶不作
aahk 一天到晚
aai 亍
aaid 天下事
aaim 副政委
%---------------------------------------------
②提取为单字码表后在in.txt中,内容如下:
%---------------------------------------------
aai 亍
%----------------------------------------------
编程设计思路
将 incode.txt 文件的内容进行读取,读取编码部分存储到p[i].key中,读取汉字部分存储到p[i].chinese中。对于前58031个p[i].chinese进行判断,如果它们的strlen小于等于5,也就是单个汉字(对p[i].chinese的strlen测试输出表明,单个汉字的strlen为5),将对应的内容都存到in.txt中既可。
文本处理函数
(1)打开和关闭TXT文件——fopen()与fclose()函数
FILE *fp=fopen("filepath","参数"); //打开文件,将指针定在文件的开头,参数表示文件打开方式
fclose(fp); //关闭文件
表示文件打开方式的参数设置有以下六种情况组成:
①r(read)读
②w(write)写
③a(append)追加
④t(text)文本文件,可省略不写
⑤b(banary) 二进制文件
⑥+读和写
(2)TXT循环读取
while (!feof(fp)) {} //表示读取文件成功后,循环读取文本内容到文本结尾
(3) 文件中内容读取——fscanf() 与 fgets()函数
我在读取编码和汉字的时候分别使用了这两个函数。思路是将第一个空格前面的内容读取出来作为编码进行存储;后面的部分一直到转行符结束,作为汉字的内容进行存储。
fscanf(fp,"%s",buf); //从指针处读取字符串,读取到空格结束
fgets(buf, sizeof(buf), fp); //从指针处读取字符串,读取到转行符结束
(4)输出内容到文件——fprintf函数
fprintf(fp1,"%s ",p[i].key); //输出编码部分到in.txt,fp1是 in.txt 文件对应的指针
实现代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 111111 //最大记录数
//定义结构体,命名为trans
struct trans
{
char *key; //编码
char *chinese; //中文
};
int main()
{
struct trans *p = NULL;
int i=0;
size_t len;
int j;
FILE *fp,*fp1;
char buf[100] = { 0 };
fp=fopen("C://Users//Administrator//Desktop//incode.txt","r"); //打开文件,只读模式
fp1=fopen("C://Users//Administrator//Desktop//in.txt","w+"); //打开文本文件in.txt,写入模式,如果没有文件则新建
if(fp==NULL) //若fopen()函数返回NULL则打开文件失败
{
printf("incode.txt文件打开失败\n");
exit(0); //退出
}
if(fp1==NULL)
{
printf("in.txt文件打开失败\n");
exit(0); //退出
}
p = (struct trans *)malloc(sizeof(struct trans) * MAX); //固定分配MAX大小内存
memset(p, 0, sizeof(struct trans) * MAX); //将分配内存初始化为0
while (!feof(fp)) //循环读取文件,直到文件末尾
{
//第一部分,读取编码存到key中
memset(buf, 0, sizeof(buf));
fscanf(fp,"%s",buf); //读取到空格结束
len = strlen(buf); //得到读取到字符串长度
if (len > 0)
{
p[i].key = (char *)malloc(len);//根据字符串长度分配内存
memset(p[i].key, 0, len);
strcpy(p[i].key, &buf[0]); //将读取到的内容拷贝到key中
}
//第二部分,读取汉字存到chinese中
memset(buf, 0, sizeof(buf));
fgets(buf, sizeof(buf), fp); //读取到转行符结束
len = strlen(buf);
if (len > 0)
{
p[i].chinese = (char *)malloc(len);
memset(p[i].chinese, 0, len);
strcpy(p[i].chinese, &buf[0]); //将读取到的内容拷贝到chinese中
}
i++; //计数器加1,表示文本文件的行数
}
//判断解释字符串,若中文是单个汉字,存到in.txt中
for(i = 0;i < 58031;i++)
{
len=strlen(p[i].chinese);
//printf("%d\n",len);
if(len<=5) //测试发现单个汉字存在数组中的strlen为5
{
fprintf(fp1,"%s %s",p[i].key,p[i].chinese); //输出郑码表中汉字为单字的记录到in.txt
}
}
fclose(fp); //关闭字典文件incode.txt
fclose(fp1); //关闭in.txt
//循环释放key与content成员内存
for (j = 0; j < i; j++)
{
if (p[j].key)
free(p[i].key);
if (p[j].chinese)
free(p[j].chinese);
}
free(p); //释放p的内存
return 0;
}
文件提取方式
链接:https://pan.baidu.com/s/1u26ALEn_djSCH-2H7tmaHA
提取码:n9pn