作者在 2011-06-21 12:50:34 发布以下内容
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 256
typedef struct
{
char ch[MAX];
int length;
}SeqString;
int main()
{
void createTextFile(); //建立文本文件函数
void StrCount(); //单词计数函数
void StrInd(); //检索单词出现在文本文件中的行号、位置以及次数的函数
int partPosition(SeqString s1,SeqString s2,int k);
int xz;
do
{
printf("*************************************\n");
printf("*文本文件的检索、子串的统计以及定位 *\n");
printf("*************************************\n");
printf("* 1.建立文本文件 *\n");
printf("* 2.单词子串的计数 *\n");
printf("* 3.单词子串的定位 *\n");
printf("* 0.退出整个系统 *\n");
printf("*************************************\n");
printf(" 请选择:1 2 3 0 ");
scanf("%d",&xz);
switch(xz)
{
case 1:createTextFile(); break;
case 2:StrCount(); break;
case 3:StrInd(); break;
case 0:return 0;
default:printf("选择错误!请重新选择:\n");
}
}while(1);
}
int partPosition(SeqString s1,SeqString s2,int k)//串匹配函数
{
int i,j;
i = k - 1;//作为扫描s1的下标,下标从0开始
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;
}//使i下标回溯到原位置的下一个位置 ,使j指向s2的第一个字符再重新比较
if(j >= s2.length)
return i + 1 - s2.length;//表示s1中存在s2,返回其起始位置
else
return -1;//表示s1中不存在s2,返回-1
}
void StrInd()
{
FILE *fp;
SeqString 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;
while(!feof(fp))
{
fread(&s,sizeof(s),1,fp);
if(feof(fp))
break;
l ++;
k = 1;
i = 0;
while(k < s.length)
{
j = partPosition(s,t,k);
if(j < 0)
break;
else
{
i ++;
wz[i] = j;
k = j + t.length;
}
}
if(i > 0)
{
printf("行号: %d, 次数: %d,位置分别为: ",l,i);
for(m = 1;m < i + 1;m ++)
printf("%5d",wz[m]);
printf("\n");
}
}
}
void createTextFile()
{
SeqString s;
char fname[10];
char yn;
FILE *fp;
printf("请输入要建立的文件名: ");
scanf("%s",&fname);
fp = fopen(fname,"w"); //以读写的方式打开文件
yn = 'n'; //输入结束标志初始值
while(yn == 'n' || yn == 'N')
{
printf("请输入一行文本 : ");
getchar();
gets(s.ch);
s.length = strlen(s.ch);
fwrite(&s,sizeof(s),1,fp); //写一行文本到文本文件中
printf("输入结束了?Y or N: ");
yn = getchar();
}
fclose(fp); //close the file
printf("建立文件结束!\n\n");
}
void StrCount()
{
FILE *fp;
SeqString s,t;
char fname[10];
int i = 0;
int j,k;
printf("请输入文本文件名: " );
scanf("%s",&fname);
fp = fopen(fname,"r"); //open the file for reading
printf("请输入要统计的单词: ");
scanf("%s",t.ch);
t.length = strlen(t.ch);
while(!feof(fp)) //扫描文本文件
{
fread(&s,sizeof(s),1,fp); //读入一行文本
if(feof(fp)) break;
k = 1; //初始化开始位置
while(k < s.length)
{
j = partPosition(s,t,k);
if(j < 0)
break;
else
{
i ++;
k = j + t.length;//继续下一个子串的检索
}
}
}
printf("\n单词 %s 在文本文件 %s 中共出现了 %d 次\n ",t.ch,fname,i);
}
#include <string.h>
#include <stdlib.h>
#define MAX 256
typedef struct
{
char ch[MAX];
int length;
}SeqString;
int main()
{
void createTextFile(); //建立文本文件函数
void StrCount(); //单词计数函数
void StrInd(); //检索单词出现在文本文件中的行号、位置以及次数的函数
int partPosition(SeqString s1,SeqString s2,int k);
int xz;
do
{
printf("*************************************\n");
printf("*文本文件的检索、子串的统计以及定位 *\n");
printf("*************************************\n");
printf("* 1.建立文本文件 *\n");
printf("* 2.单词子串的计数 *\n");
printf("* 3.单词子串的定位 *\n");
printf("* 0.退出整个系统 *\n");
printf("*************************************\n");
printf(" 请选择:1 2 3 0 ");
scanf("%d",&xz);
switch(xz)
{
case 1:createTextFile(); break;
case 2:StrCount(); break;
case 3:StrInd(); break;
case 0:return 0;
default:printf("选择错误!请重新选择:\n");
}
}while(1);
}
int partPosition(SeqString s1,SeqString s2,int k)//串匹配函数
{
int i,j;
i = k - 1;//作为扫描s1的下标,下标从0开始
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;
}//使i下标回溯到原位置的下一个位置 ,使j指向s2的第一个字符再重新比较
if(j >= s2.length)
return i + 1 - s2.length;//表示s1中存在s2,返回其起始位置
else
return -1;//表示s1中不存在s2,返回-1
}
void StrInd()
{
FILE *fp;
SeqString 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;
while(!feof(fp))
{
fread(&s,sizeof(s),1,fp);
if(feof(fp))
break;
l ++;
k = 1;
i = 0;
while(k < s.length)
{
j = partPosition(s,t,k);
if(j < 0)
break;
else
{
i ++;
wz[i] = j;
k = j + t.length;
}
}
if(i > 0)
{
printf("行号: %d, 次数: %d,位置分别为: ",l,i);
for(m = 1;m < i + 1;m ++)
printf("%5d",wz[m]);
printf("\n");
}
}
}
void createTextFile()
{
SeqString s;
char fname[10];
char yn;
FILE *fp;
printf("请输入要建立的文件名: ");
scanf("%s",&fname);
fp = fopen(fname,"w"); //以读写的方式打开文件
yn = 'n'; //输入结束标志初始值
while(yn == 'n' || yn == 'N')
{
printf("请输入一行文本 : ");
getchar();
gets(s.ch);
s.length = strlen(s.ch);
fwrite(&s,sizeof(s),1,fp); //写一行文本到文本文件中
printf("输入结束了?Y or N: ");
yn = getchar();
}
fclose(fp); //close the file
printf("建立文件结束!\n\n");
}
void StrCount()
{
FILE *fp;
SeqString s,t;
char fname[10];
int i = 0;
int j,k;
printf("请输入文本文件名: " );
scanf("%s",&fname);
fp = fopen(fname,"r"); //open the file for reading
printf("请输入要统计的单词: ");
scanf("%s",t.ch);
t.length = strlen(t.ch);
while(!feof(fp)) //扫描文本文件
{
fread(&s,sizeof(s),1,fp); //读入一行文本
if(feof(fp)) break;
k = 1; //初始化开始位置
while(k < s.length)
{
j = partPosition(s,t,k);
if(j < 0)
break;
else
{
i ++;
k = j + t.length;//继续下一个子串的检索
}
}
}
printf("\n单词 %s 在文本文件 %s 中共出现了 %d 次\n ",t.ch,fname,i);
}