文本文件资料单词的检索 大数据结构
数据库的全文检索与文本分析技术

数据库的全文检索与文本分析技术数据库作为一种用于存储和管理数据的系统在现代信息化建设中起着非常重要的作用。
然而,在海量的数据中快速查找特定信息却是一个具有挑战性的任务。
为了解决这一问题,全文检索与文本分析技术应运而生。
本文将介绍数据库的全文检索与文本分析技术,包括基本概念、应用场景和实现方法。
首先,我们来介绍全文检索的概念。
全文检索是一种用于从文本数据中查找特定关键词或词组的技术。
与传统的索引方式不同,全文检索技术将整篇文本全部作为索引的内容,而不仅仅是关键词或词组。
这使得全文检索能够在大规模文本数据中高效地查找到相关信息。
全文检索的应用场景非常广泛。
例如,在电商网站中,用户可以输入商品的关键词进行搜索,全文检索技术能够快速给出与关键词相关的商品信息。
在新闻网站中,用户可以通过关键词搜索到感兴趣的新闻主题。
全文检索技术也被广泛应用于企业内部的知识管理系统,帮助员工快速找到所需的信息。
总之,全文检索技术可以在各个领域中提高用户的搜索效率。
实现全文检索的关键是建立索引。
索引是一种数据结构,用于加速数据的查找。
在全文检索中,索引通常包括倒排索引和正排索引。
倒排索引是将词条映射至包含该词条的文档列表,通过这样的映射关系可以快速找到相关文档。
正排索引则是将文档映射至其包含的词条列表,以支持更加复杂的检索方式。
通过使用这些索引,全文检索技术可以实现快速的查找和排序操作。
除了全文检索,文本分析也是数据库中一个重要的技术。
文本分析是指对文本数据进行结构化和分析的过程。
它可以帮助我们更好地理解和利用文本数据。
在文本分析中,常用的技术包括关键词提取、实体命名识别、情感分析和主题建模等。
关键词提取是文本分析中的一项基础任务。
通过关键词提取,我们可以从文本中提取出表示内容的重要词语。
这对于搜索引擎的建立和文本摘要生成等任务非常关键。
实体命名识别是指从文本中识别出人名、地名、组织名等有特定意义的实体。
情感分析则是用于分析文本中蕴含的情感极性,帮助我们了解用户对于特定事物的情感态度。
全文数据库以及检索方式介绍

全文数据库是一种特殊的数据库,主要用于存储和检索文本数据。
全文数据库与传统的关系型数据库不同,它专门针对文本数据设计,使用特殊的算法和技术来处理文本信息,以便更快速、更准确地检索相关信息。
全文数据库的检索方式通常包括以下几种:
关键词检索:这是最常用的检索方式。
用户输入关键词,系统会检索数据库中包含该关键词的文本,并返回相关的结果。
布尔检索:布尔检索是一种基于逻辑关系的检索方式,包括AND、OR、NOT 三种关系。
通过使用布尔运算符,用户可以组合多个关键词,以便更精确地查找信息。
自然语言检索:自然语言检索允许用户使用自然语言提问,系统将自动分析用户的提问,并返回相关的结果。
这种检索方式更接近人类的交流方式,可以提高用户的检索体验。
高级检索:高级检索通常包括字段检索、位置检索、短语检索等。
用户可以指定文本的特定字段(如标题、摘要、关键词等),或者指定文本中关键词的位置和短语结构,以便更精确地查找信息。
文本相似度检索:文本相似度检索基于文本的相似度进行匹配。
系统会计算输入文本与数据库中存储的文本之间的相似度,并返回相似度最高的结果。
这种检索方式可以帮助用户找到与输入文本相似的信息。
总之,全文数据库和其检索方式为人们提供了方便快捷的文本信息检索服务,广泛应用于信息检索、知识管理、内容管理等领域。
文本文件单词的检索与计数

软件综合课程设计文本文件单词的检索与计数实时监控报警系统二〇一四年六月文本文件单词的检索与计数1.问题陈述要求编程建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;统计给定单词在文本文件中出现的总次数;检索输出某个单词出现在文本中的行号、在该行中出现的次数以及位置。
该设计要求可分为三个部分实现:其一,建立文本文件,文件名由用户用键盘输入;其二,给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数;其三,检索给定单词,输入一个单词,检索并输出该单词所在的行号、该行中出现的次数以及在该行中的相应位置。
(1).建立文本文件(2)给定单词的计数(3)检索单词出现在文本文件中的行号、次数及其位置(4)主控菜单程序的结构①头文件包含②菜单选项包含建立文件、单词定位、单词计数、退出程序③选择1-4执行相应的操作,其他字符为非法。
2.程序代码#include<stdio.h>#include<string.h>#include<iostream>#define MaxStrSize 256 //根据用户需要自己定义大小using namespace std;typedef struct {char ch[MaxStrSize]; //ch是一个可容纳256个字符的字符数组int length;} SString;//定义顺序串类型int PartPosition (SString s1,SString s2,int k){ int i,j;i=k-1;//扫描s1的下标,因为c中数组下标是从0开始,串中序号相差1 j=0;//扫描s2的开始下标while(i<s1.length && j<s2.length){if(s1.ch[i]==s2.ch[j]){ i++;j++; //继续使下标移向下一个字符位置}else{i=i-j+1; j=0;} }if (j>=s2.length)return i-s2.length;elsereturn -1;//表示s1中不存在s2,返回-1//表示s1中存在s2,返回其起始位置} //函数结束void CreatTextFile(){SString S;char fname[10],yn;FILE *fp;printf("输入要建立的文件名:");scanf("%s",fname);fp=fopen(fname,"w");yn='n';//输入结束标志初值while(yn=='n'||yn=='N'){printf("请输入一行文本:");gets(S.ch);gets(S.ch);S.length=strlen(S.ch);fwrite(&S,S.length,1,fp);fprintf(fp,"%c",10);//是输入换行printf("结束输入吗?y or n :");yn=getchar();}fclose(fp);//关闭文件printf("建立文件结束!");}void SubStrCount(){FILE *fp;SString S,T;//定义两个串变量char fname[10];int i=0,j,k;printf("输入文本文件名:");scanf("%s",fname);fp=fopen(fname,"r");printf("输入要统计计数的单词:");cin>>T.ch;T.length=strlen(T.ch);while(!feof(fp)){ //扫描整个文本文件// fread(&S.ch,1,sizeof(S),fp);//读入一行文本 memset(S.ch,'\0',256);fgets(S.ch,100,fp);S.length=strlen(S.ch);k=0; //初始化开始检索位置while(k<S.length-1) //检索整个主串S{j=PartPosition(S,T,k);//调用串匹配函数if(j<0 ) break;else {i++;//单词计数器加1k=j+T.length;//继续下一字串的检索 }}}printf("\n单词%s在文本文件%s中共出现%d次\n",T.ch,fname,i);}//统计单词出现的个数void SubStrInd(){ FILE *fp;SString S,T; //定义两个串变量char fname[10];int i,j,k,l,m;int wz[20]; //存放一行中字串匹配的多个位置printf("输入文本文件名:");scanf("%s",fname);fp=fopen(fname,"r");printf("输入要检索的单词:");scanf("%s",T.ch);T.length=strlen(T.ch);l=0; //行计数器置0while(!feof(fp)) { //扫描整个文本文件//fread(&S,sizeof(S),1,fp); //读入一行文本memset(S.ch,'\0',256);fgets(S.ch,256,fp);S.length=strlen(S.ch);l++; //行计数器自增1k=0;//初始化开始检索位置i=0; //初始化单词计数器while(k<S.length-1) //检索整个主串S{ j=PartPosition(S,T,k); //调用串匹配函数if(j<0) break;else {i++;//单词计数器加1wz[i]=j;//记录匹配单词位置k=j+T.length;//继续下一字串检索}}if(i>0){ printf("行号:%d,次数:%d,位置分别为:",l,i);for(m=1;m<=i;m++) printf("%4d",wz[m]+1);printf("\n");}}}//检索单词出现在文本文件中的行号、次数及其位置int main(){ void CreatTextFile(),SubStrCount(),SubStrInd();int xz;do {printf("* * * * * * * * * * * * * * * * * * * ** * * * *\n");printf("*文本文件的检索、字串的统计及定位*\n");printf("* * * * * * * * * * * * * * * * * * * ** * * * *\n");printf("* 1. 建立文本文件*\n");printf("* 2. 单词字串的计数*\n");printf("* 3. 单词字串的定位*\n");printf("* 4. 退出整个程序*\n");printf("* * * * * * * * * * * * * * * * * * * ** * * * *\n");printf(" 请选择(1--4) ");scanf("%d",&xz);switch(xz) {case 1 : CreatTextFile();break;case 2 : SubStrCount();break;case 3 : SubStrInd();break;case 4 : return 0;default:printf("选择错误,重新选\n");}}while(1);}3.运行结果4.设计体会与总结我的课程设计题目是文本文件单词的检索与计数。
使用MySQL技术进行海量文本数据的存储与快速检索

使用MySQL技术进行海量文本数据的存储与快速检索随着互联网的快速发展,越来越多的文本数据被产生和存储。
这些数据无论是从社交媒体平台、电子商务网站还是科学研究中产生,都需要进行高效的存储和快速检索。
而MySQL作为一种常见的关系型数据库管理系统,可以提供强大的功能来存储和检索海量文本数据。
本文将讨论如何使用MySQL技术来进行海量文本数据的存储与快速检索。
首先,我们需要考虑如何存储海量文本数据。
在MySQL中,可以使用VARCHAR或TEXT类型来存储文本数据。
VARCHAR类型适用于比较短的文本,而TEXT类型则适用于较长的文本。
当数据量超过TEXT类型的存储限制时,可以考虑使用MEDIUMTEXT或LONGTEXT类型。
接下来,为了实现快速检索,我们可以利用MySQL提供的全文索引功能。
全文索引是一种特殊类型的索引,可以有效地在大型文本数据集合中进行关键词搜索。
在MySQL中,可以使用FULLTEXT索引来创建全文索引。
使用FULLTEXT索引不仅可以加快搜索速度,还可以提供搜索结果的相关性排序。
除了全文索引,还可以考虑其他的索引方式来提高检索性能。
例如,可以创建唯一索引来确保数据的唯一性,并通过使用多列索引来加快多条件查询。
还可以使用B-tree索引或Hash索引等不同类型的索引来优化不同类型的查询操作。
此外,为了进一步优化检索性能,可以考虑使用分区表来存储和管理海量文本数据。
通过将数据分割为多个分区,可以降低查询的范围,从而提高查询效率。
可以按照时间、地理位置或其他合适的标准来进行数据分区。
另一个重要的方面是数据备份和恢复。
由于海量文本数据的重要性,必须确保数据的安全性和可恢复性。
在MySQL中,可以使用物理备份或逻辑备份等方法来实现数据备份。
物理备份可以完整地复制数据库的所有文件,包括数据文件和索引文件。
逻辑备份则以逻辑方式备份数据库中的数据和结构。
此外,还可以使用MySQL的复制功能来实现数据的实时备份和冗余。
全文检索流程

全文检索流程
全文检索是一种信息检索方式,它能够从大量的文档中找出包含特定关键词的文档。
全文检索的流程通常包括以下步骤:
1. 分词:将文档分成一个一个单独的单词,去除标点符号和停词(常用但无实际意义的词,如“的”、“是”等)。
这个过程称为“分词”。
2. 词干提取:将单词缩减为词根形式,例如将“cars”缩减为“car”。
3. 词形还原:将单词转变为词根形式,例如将“drove”还原为“drive”。
4. 索引:对字典按字母顺序进行排序,合并相同的词(Term)成为文档倒
排(Posting List)链表。
5. 检索:用户输入要检索的关键词,计算机采用全文检索方法检索所有的文档,将包含关键词的文档列成一个清单。
6. 相似度判断:用户选定清单中感兴趣的若干文档(这些文档被称为种子文档),然后计算机以用户选定的文档为依据,再次检索所有的文档,找出内容上和用户选定的文档相似的文档。
计算机采用判断两文档出现相同词汇的概率是否相近的方法来判断一文档是否和种子文档相似。
完成上述步骤后,全文检索的结果就呈现给了用户,用户可以根据需要进行进一步的筛选和使用。
全文检索数据集

全文检索数据集全文检索数据集是指用于进行全文检索任务的数据集,它包含了大量的文本数据,以及与之相关的标签或元数据。
全文检索是一种用于快速搜索和匹配文本内容的技术,可以用于各种应用场景,如搜索引擎、电子图书馆、新闻聚合等。
全文检索数据集的构建过程通常包括以下几个步骤。
首先,需要收集大量的文本数据,可以来自于互联网、文档库、论文集等多个来源。
然后,对这些文本数据进行预处理,包括去除特殊字符、分词、停用词处理等,以便于后续的索引和检索操作。
接下来,需要根据实际需求为文本数据添加标签或元数据,以方便后续的检索和分类任务。
最后,将处理后的数据存储到数据库中,以供全文检索系统进行快速查询和匹配操作。
在进行全文检索任务时,可以使用各种算法和技术来提高检索的准确性和效率。
常用的算法包括倒排索引、向量空间模型、BM25等。
倒排索引是一种用于加速文本检索的数据结构,它通过将文档中的每个单词与包含该单词的文档列表关联起来,实现了快速的词项检索。
向量空间模型则将文本表示为向量,通过计算向量之间的相似度来进行文本匹配。
而BM25算法则是一种用于评估文档相关性的算法,它考虑了词频、文档长度等因素,能够更准确地衡量文档和查询之间的匹配程度。
全文检索数据集的应用非常广泛。
在搜索引擎中,全文检索数据集可以用于构建搜索索引,提供用户快速准确的搜索结果。
在电子图书馆中,全文检索数据集可以用于用户检索图书、论文等相关文献。
在新闻聚合应用中,全文检索数据集可以用于实时搜索和推荐相关新闻内容。
除此之外,全文检索数据集还可以应用于信息抽取、文本分类、知识图谱构建等多个领域。
全文检索数据集是一种用于进行全文检索任务的数据集,它包含了大量的文本数据和与之相关的标签或元数据。
通过合理构建和利用全文检索数据集,可以实现快速准确的文本搜索和匹配,从而提高用户的检索体验和信息获取效率。
信息检索考试大一下知识点

信息检索考试大一下知识点信息检索是指从大量的信息中快速找到满足特定需求的信息过程。
在大一下学期的信息检索考试中,通常会涉及以下几个知识点:一、信息检索基础概念1. 信息检索的定义和目的信息检索是指通过使用计算机技术,在海量信息中寻找到与用户需求相匹配的信息。
其目的是快速、准确地获取到用户所需的信息。
2. 检索模型和流程信息检索基于检索模型,常见的模型包括布尔模型、向量空间模型和概率模型。
检索流程一般包括问题建模、索引构建、查询处理和结果排序等步骤。
二、关键词检索1. 关键词的选择与组合在进行信息检索时,关键词的选择和组合非常重要。
关键词应该准确描述用户需求,并且能够尽可能覆盖相关领域的信息。
2. 布尔查询与逻辑运算符布尔查询是一种基础的检索方式,通过使用逻辑运算符(AND、OR、NOT)对关键词进行组合,从而获得符合用户需求的信息。
三、索引构建与检索技术1. 逆向索引逆向索引是一种常用的索引结构,它通过将文档中的每个单词与包含该单词的文档进行关联,实现了关键词到文档的快速定位。
2. 向量空间模型向量空间模型将文档和查询都表示为向量,在向量空间中进行计算,通过计算文档与查询之间的相似度来判断文档的相关性。
3. 布尔模型的实现与优化布尔模型的实现与优化涉及到倒排索引的构建与压缩、布尔运算的优化算法等方面的技术。
四、评价与改进1. 检索结果的评价对于检索系统的性能评价,一般使用准确率、召回率、F值等指标来衡量检索的有效性和完整性。
2. 改进方法与技术为了提升检索系统的性能,可以采用词干提取、查询扩展、排名算法优化等方式进行改进。
五、实际应用与发展趋势1. 商业搜索引擎与个性化推荐商业搜索引擎通过不断改进和优化信息检索技术,提供高效准确的搜索服务。
个性化推荐则基于用户的兴趣和行为,向用户推荐符合其需求的信息。
2. 大数据与信息检索随着大数据时代的到来,信息检索面临着处理海量数据的挑战。
如何有效地利用大数据技术来进行信息检索是当前的研究热点之一。
达梦全文检索的原理和实现

达梦全文检索的原理和实现全文检索是对大数据文本进行索引,在建立的索引中对要查找的单词进行进行搜索,定位哪些文本数据包括要搜索的单词。
因此,全文检索的全部工作就是建立索引和在索引中搜索定位,所有的工作都是围绕这两个来进行的。
下面就逐个介绍。
建立全文索引中有两项非常重要,一个是如何对文本进行分词,一是建立索引的数据结构。
分词的方法基本上是二元分词法、最大匹配法和统计方法。
索引的数据结构基本上采用倒排索引的结构。
分词的好坏关系到查询的准确程度和生成的索引的大小。
在中文分词发展中,早期经常使用分词方式是二元分词法,该方法的基本原理是将包含中文的句子进行二元分割,不考虑单词含义,只对二元单词进行索引。
因此该方法所分出的单词数量较多,从而产生的索引数量巨大,查询中会将无用的数据检索出来,好处是算法简单不会漏掉检索的数据。
之后又发展出最大匹配分词方法,该方法又分为正向最大分词和逆向最大分词。
其原理和查字典类似,对常用单词生成一个词典,分析句子的过程中最大的匹配字典中的单词,从而将句子拆分为有意义的单词链。
最大匹配法中正向分词方法对偏正式词语的分辨容易产生错误,比如“首饰和服装”会将“和服”作为单词分出。
达梦数据库采用的是改进的逆向最大分词方法,该分词方法较正向正确率有所提高。
最为复杂的是通过统计方式进行分词的方法。
该方法采用隐式马尔科夫链,也就是后一个单词出现的概率依靠于前一个单词出现的概率,最后统计所有单词出现的概率的最大为分词的依据。
这个方法对新名词和地名的识别要远远高于最大匹配法,准确度随着取样文本的数量的增大而提高。
二元分词方法和统计方法是不依赖于词典的,而最大匹配法分词方法是依赖于词典的,词典的内容决定分词结构的好坏。
全文检索的索引被称为倒排索引,之所以成为倒排索引,是因为将每一个单词作为索引项,根据该索引项查找包含该单词的文本。
因此,索引都是单词和唯一记录文本的标示是一对多的关系。
将索引单词排序,根据排序后的单词定位包含该单词的文本。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
滁州学院课程设计报告课程名称:数据结构设计题目:文本文件单词的检索系别:网络与通信工程系专业:网络工程组别:起止日期:2012 年6月14 日~ 2012 年6月21日指导教师:计算机与信息工程学院二○一二年制目录1 引言 (3)2 分析 (3)2.1建立文本文件建立文本文件的实现思路 (3)2.2给定单词的计数 (3)2.3检索单词出现在文本文件中的行号、次数及其位置 (3)2.4主控菜单程序的结构 (3)3 详细分析 (3)3.1流程图 (3)3.1.1建立文本文件 (3)3.1.2给定单词的计数 (4)3.2程序的实现 (6)3,2.1预编命令,定义结构体和全局变量 (7)3.2.2建立文本文件 (7)3.2.3检索某单词的行号,出现次数,以及位置 (8)3.2.4菜单函数 (9)3.2.4退出整个程序 (10)3.2.5主体函数 (10)4 调试与操作说明 (10)4.1开始界面如图4-1所示 (11)4.2输入文本文件,计数单词出现的次数。
如图4-2所示 (11)4.3检索某单词的行号,出现次数,以及位置。
如图4-3,4-4所示 (11)5 总结讨论 (12)6 致谢 (13)7 参考文献 (13)1 引言本程序主要围绕的是文本文件单词的检索与计数,正文包括:对文本文件单词的检索与计数程序的详细要求,对程序的分析,勾画程序思路及内容的流程图,主程序代码,程序运行后相对应要求的所有截图,还有我们做完程序后的总结讨论,以及我们在本次程序中的详细分工。
2 分析2.1 建立文本文件建立文本文件的实现思路(1)定义一个串变量(2)定义文本文件(3)输入文件名,打开该文件(4)循环读入文本行,写入文本文件,其过程如下:While(不是文件输入结束){读入一文本行至串变量;串变量写入文件;输入是否结束输入标志;}(5)关闭文件2.2给定单词的计数该功能需要用到前一节中设计的模式匹配算法,逐行扫描文本文件。
匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词的次数。
2.3 检索单词出现在文本文件中的行号、次数及其位置2.4 主控菜单程序的结构(1)头文件包含(2)菜单选择包括:1、建立文件2、单词计数3、单词定位4、退出程序(3)选择1~4执行相应的操作,其他字符为非法3 详细分析3.1流程图3.1.1建立文本文件定义一个串变量,定义文本文件,输入文件名,打开该文件,循环读入文本行,写入文件。
如图3-1所示图3-1 建立文本基本流程图建立文本文件的思路过程3.1.2给定单词的计数逐行扫描文本文件。
匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词的次数。
如图3-2所示图3-2 单词计数流程图给定单词计数的过程逐行扫描文本文件。
扫描一个单词,单词数加1,匹配一个,计数器加1,输出该单词数,行数到底以此,行数加1,单词数清零,直到整个文件扫描结束;然后输出单词的次数,行号,第几个单词。
如图3-3所示如3-3 检索单词行号、次数和位置流程图检索单词的出现在文本文件中的行号,次数以及位置3.2程序的实现3,2.1预编命令,定义结构体和全局变量/////////////////////////////////////////////////////////////////////////////// ///// 文本文件单词的检索系统//////////////////////////// //////////////////////////////////////////////////////////////////////////////#include<stdio.h>#include<string.h>#define MaxStrSize 256 /* 根据用户需要自己定义大小*/typedef struct {char ch[MaxStrSize]; /* ch是一个可容纳256个字符的字符数组*/int length;} SString;/* 定义顺序串类型*/int PartPosition (SString s1,SString s2,int k){ int i,j;i=k-1;/* 扫描s1的下标,因为c中数组下标是从0开始,串中序号相差1 */j=0;/* 扫描s2的开始下标*/while(i<s1.length && j<s2.length){if(s1.ch[i]==s2.ch[j]){ i++;j++; /* 继续使下标移向下一个字符位置*/}else{i=i-j+1; j=0;} }if (j>=s2.length)return i-s2.length;elsereturn -1;/* 表示s1中不存在s2,返回-1 *//* 表示s1中存在s2,返回其起始位置*/} /* 函数结束*/3.2.2建立文本文件/////////////////////////////////////////////////////////////////////*件一个文本文件,在里面输入想要的文本*/void CreatTextFile(){SString S;char fname[10],yn;FILE *fp;printf("输入要建立的文件名:");scanf("%s",fname);fp=fopen(fname,"w");yn='n';/* 输入结束标志初值*/while(yn=='n'||yn=='N'){printf("请输入一行文本:");gets(S.ch);gets(S.ch);S.length=strlen(S.ch);fwrite(&S,S.length,1,fp);fprintf(fp,"%c",10);/* 是输入换行*/printf("结束输入吗?y or n :");yn=getchar();}fclose(fp);/* 关闭文件*/printf("建立文件结束!\n");}3.2.3检索某单词的行号,出现次数,以及位置//////////////////////////////////////////////////////////////////////// /*输入2进行计算出现次数,输入3可以确定文本出现的位置,以此实现检索单词的出现在文本文件中的行号,次数以及位置*/void SubStrCount(){FILE *fp;SString S,T;/* 定义两个串变量*/char fname[10];int i=0,j,k;printf("输入文本文件名:");scanf("%s",fname);fp=fopen(fname,"r");printf("输入要统计计数的单词:");scanf("%s",T.ch);T.length=strlen(T.ch);while(!feof(fp)){ /* 扫描整个文本文件*//* fread(&S.ch,1,sizeof(S),fp);//读入一行文本*/memset(S.ch,'\0',256);fgets(S.ch,100,fp);S.length=strlen(S.ch);k=0; /* 初始化开始检索位置*/while(k<S.length-1) /* 检索整个主串S */{j=PartPosition(S,T,k);/* 调用串匹配函数*/if(j<0 ) break;else {i++;/* 单词计数器加1 */k=j+T.length;/* 继续下一字串的检索*/}}}printf("\n单词%s在文本文件%s中共出现%d次\n",T.ch,fname,i);}/* 统计单词出现的个数*/void SubStrInd(){ FILE *fp;SString S,T; /* 定义两个串变量*/char fname[10];int i,j,k,l,m;int wz[20]; /* 存放一行中字串匹配的多个位置*/printf("输入文本文件名:");scanf("%s",fname);fp=fopen(fname,"r");printf("输入要检索的单词:");scanf("%s",T.ch);T.length=strlen(T.ch);l=0; /* 行计数器置0 */while(!feof(fp)) { /* 扫描整个文本文件*//* fread(&S,sizeof(S),1,fp); //读入一行文本*/memset(S.ch,'\0',256);fgets(S.ch,256,fp);S.length=strlen(S.ch);l++; /* 行计数器自增1 */k=0;/* 初始化开始检索位置*/i=0; /* 初始化单词计数器*/while(k<S.length-1) /* 检索整个主串S */{j=PartPosition(S,T,k); /* 调用串匹配函数*/if(j<0) break;else {i++;/* 单词计数器加1 */wz[i]=j;/* 记录匹配单词位置*/k=j+T.length;/* 继续下一字串检索*/}}if(i>0){printf("行号:%d,次数:%d,位置分别为:",l,i);for(m=1;m<=i;m++) printf("%4d",wz[m]+1); printf("\n");}}}/* 检索单词出现在文本文件中的行号、次数及其位置*/3.2.4菜单函数////////////////////////////////////////////////////////////////////////////////*编写菜单函数,以便使用者方便运行使用。
按1建立文本文件,按2进行单词字符串的计数,按3进行单词字符串的定位,按4退出程序程序*/void CreatTextFile(),SubStrCount(),SubStrInd();int xz;do {printf("===============================================\n");printf("|| 文本文件的检索、字串的统计及定位||\n");printf("||=========================================== ||\n");printf("|| 1. 建立文本文件||\n");printf("|| 2. 单词字串的计数||\n");printf("|| 3. 单词字串的定位||\n");printf("|| 4. 退出整个程序||\n");printf("===============================================\n");printf(" 请选择(1--4)\n ");scanf("%d",&xz);switch(xz) {case 1 : CreatTextFile();break;case 2 : SubStrCount();break;case 3 : SubStrInd();break;case 4 : return 0;default:printf("选择错误,重新选\n");}}3.2.4退出整个程序////////////////////////////////////////////////////////////////////// /*用此函数来退出文本文件的单词检索*/void end(){printf("谢谢使用文本文件的单词检索!\n");exit(0);}3.2.5主体函数////////////////////////////////////////////////////////////////////////////////*主函数,利用无限循环可以进行连续的操作*/int main(){ while(1);{CreatTextFile(),SubStrCount(),SubStrInd();}}4 调试与操作说明4.1开始界面如图4-1所示图4-1 文本文件开始界面我们可以看到共有四个选项,从1到4依次完成建立文本文件,到单词字串计数,再到单词字串的定位,最后退出!4.2输入文本文件,计数单词出现的次数。