要求编程建立一个文本文件,每个单词不包括空格及跨行,单词由字符序列构成且区分大小写,完成以下功能:统计给定单词在文本文件中出现的总次数、检索输出某单词在文本文件中首次出现的行号及位置。
出现的问题:当选定单词是某一行最后一个单词时,记录行数的计数器会多记录一次行数.
编程环境是codeblocks,编译器是GUN-GCC,操作系统是win7-64 #include
char* Newfile()//建立一个新的文本文档,并将输入内容写入文本中 {
FILE *fp;
char ch,filename[10];
printf(\请输入文件名:(包括拓展名)\\n\ scanf(\ fp=fopen(filename,\ ch=getchar();
printf(\请输入单词:(请以$符号结束)\\n\ while(ch!='$') {
ch=getchar(); fputc(ch,fp);
}
fclose(fp); return filename; }
int Index(char* p)//朴素模式匹配算法 {
FILE *fp;
if((fp=fopen(p,\ {
printf(\找不到文件\\n\ exit(0); }
//将文件读取到一维数组当中 char S[100],T[20]; char ch1,ch2; ch1=fgetc(fp);
int i=0;//i用于记录主串的长度 while(ch1!='$') {
S[i]=ch1; ch1=fgetc(fp);
i++; } S[i]='$'; //建立子串
printf(\请输入你选择的单词:\\n\ ch2=getchar(); ch2=getchar();
int j=0;//j用于记录输入的子串的长度 while(ch2!='\\n') {
T[j]=ch2; ch2=getchar(); j++; }
//朴素模式匹配算法实现
int row,col;//row为列,col为行 row=1; col=1;
int m,n,q;//m为S的下标,n为T的下标,q用于换行时记录m的值 m=0; n=0; q=1;
int num=0;//num用于记录选定单词出现的次数 while(m< jbr> { if(S[m]==T[n]) { m++; n++; } else {
m=m-n+1; n=0; }; if(n==j) {
num++; if(col==1) {
row=m-n+1;
printf(\第%d个单词出现的位置是第%d行第%d个\\n\ }
else {
row=m-n-q;
printf(\第%d个单词出现的位置是第%d行第%d个\\n\ } }
if(S[m]=='\\n') {
col++; q=m; };
if(S[m]=='$') {
printf(\所选单词出现的次数是%d\\n\ } } }
int main() {
char *p;//p用于记录和传递传递用户输入的文件名 p=Newfile(); Index(p); }
兰州大学数据结构课程设计实验七:文本文件单词的检索及计数



