C语言文本处理——提取单子码表

功能分析

现有包括郑码与拼音的一个词典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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值