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

    xiaoxiao2023-11-15  154

    功能分析

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