代码拉取完成,页面将自动刷新
#include"head.h"
using namespace std;
//串实例
SString sstring;
//展示菜单
void ShowMenu()
{
printf("*************************************");
printf("**********1、新建一个文本************");
printf("**********2、输出文本内容************");
printf("**********3、添加文本内容************");
printf("**********4、查找文本内容************");
printf("**********5、打印总文件表************");
printf("**********6、求指定串长度************");
printf("**********7、打开指定文件************");
printf("***************0、退出***************");
printf("*************************************");
}
void StringLength()
{
/*
char s[MaxSize];
ifstream in(FileName, ios::in);
while (!in.eof())
in >> s;
sstring.length = strlen(s);
return sstring.length;
*/
FILE* fp;
fp = fopen(FileName, "r");
if (fp == NULL)
{
printf("文件未打开\n");
system("pause");
return;
}
while (fgets(sstring.str1, 1024, fp) != NULL);
sstring.length = strlen(sstring.str1);
printf("串长为:");
printf("%d\n", sstring.length);
fclose(fp);
fp = NULL;
return;
}
//创建文件
void CreateFileX()
{
//创建文件
scanf("%s", FileName);
FILE *fp1;
fp1 = fopen(FileName,"w");
if (fp1 != NULL)
{
printf("创建成功!\n");
fclose(fp1);
fp1 = NULL;
}
//把文件名字输出到文件
FILE *fp2;
fp2 = fopen("text.txt", "a");
if (fp2 == NULL)
{
printf("文件无法打开");
}
else
{
//把每一次创建的文件名字输出到text文件保存
fprintf(fp2, "%s\n", FileName);
fclose(fp2);
}
fp2 = NULL;
}
//输出文件内容
void ShowFile()
{
//临时变量
char* sq;
FILE* fp;
fp = fopen(FileName,"r");
if (fp == NULL)//判断打开的文件是否为空,空则报错
{
printf("打开失败\n");
system("pause");
return;
}
//判断文件是否为空
fgetc(fp);fgetc(fp);//读取一个字符用来判断文件是否为空
if(feof(fp)) //feof()有返回0,没有返回1
{
printf("文件为空\n");
system("pause");
fclose(fp);
fp = NULL;
return;
}
else
{
rewind(fp);//将光标调回开头否则读取的时候就会少掉第一位
while (fgets(sstring.str1, 1024, fp) != NULL);//循环读取主串
sq = sstring.str1;
printf("%s\n", sq);
sstring.length = strlen(sq);
printf("串长为:%d\n", sstring.length);
}
fclose(fp);
fp = NULL;
}
//添加内容到文本文件
void AddFile()
{
//添加s1到文件中
char s1[1000];
FILE* fp;
fp = fopen(FileName, "a+");
if (fp == NULL)//判断打开的文件是否为空,空则报错
{
printf("打开失败\n");
system("pause");
return;
}
printf("请输入主串s1:\n");
scanf("%s", s1);
fputs(s1, fp);
fclose(fp);
fp = NULL;
system("cls");
}
//将文件中的串读到数组中
#if 0
//初始化
void init()
{
sstring s;
ifstream in(FileName);
if (!in.is_open())
{
cerr << "无法打开文件";
system("pause");
return;
}
while (!in.eof())//把文件的内容输入到ss1
{
in >> s.str1;
//cout<<s.str1;
}
in.close();
//return s.str1;
}
#endif
void init()
{
FILE* fp;
fp = fopen(FileName, "r");
if (fp == NULL)//判断打开的文件是否为空,空则报错
{
printf("打开失败\n");
system("pause");
return;
}
//初始化str1
while (fgets(sstring.str1, 1024, fp) != NULL);
fclose(fp);
fp = NULL;
}
//计算next的值
void GetNext(char T[], int next[])
{
int i, j, len;
next[0] = -1;
for (j = 1; T[j] != '\0'; j++) { //依次求next[j]
for (len = j - 1; len >= 1; len--)
{
//相等子串的最大长度为j-1,从判断是否有最大长度的子串开始,若没有,依次-1,直到求出最长的相等子串 ,
//或者直到为1,未求得最长的相等子串
for (i = 0; i < len; i++) //依次比较T[0]~T[len-1]与T[j-len]~T[j-1
if (T[i] != T[j - len + i])
break;
if (i == len) //最大真前缀 长度为len
{
next[j] = len;
break;
}
}
if (len < 1) next[j] = 0; //其他情况,无相等子串
}
}
//BF算法
#if 1
int FindStringBf(char S[], char T[])
{
init();
int index = 0;
int i = 0, j = 0;
while ((S[i] != '\0') && (T[j] != '\0'))
{
if (S[i] == T[j]) //匹配上一个字母,主串和模式串都后移一个位置
{
i++;
j++;
}
else //主串移动一个位置,模式串直接回到原点
{
index++;
i = index;
j = 0;
//i和j分别回溯
}
}
if (T[j] == '\0') //模式串完整匹配
return index; //返回本趟匹配开始的下标
else
return 0;
}
#endif
#if 1
//KMP算法
int FindStringKmp(char S[], char T[])
{
//sstring s;
init();
int i = 0, j = 0;
int next[1000]; //假定模式最长为80个字符
GetNext(T, next);//求出模式串T的每一个对应的next值,方便j的回溯
while (S[i] != '\0' && T[j] != '\0')
{
if (S[i] == T[j]) //匹配则主串和子串都移动一个位置
{
i++;
j++;
}
else //不匹配则将模式串j回溯到next[j]的位置接着匹配,主串i不回溯
{
j = next[j];
if (j == -1)
//如果主串和模式串的第一个就不匹配,则主串i和模式串j都向后移动一个位置,next[0] =-1,模式串j并不存在比0位置再前面的位置了 ,不用回溯
{
i++;
j++;
}
}
}
if (T[j] == '\0') {//模式串完整匹配
//s.length++;
return(i - strlen(T));//返回本趟匹配的开始的下标
}
else
return 0;
}
#endif
//显示全部文件名
void ShowAllFileName()
{
FILE* fp;
fp = fopen("C:\\Users\\LiJianTao\\source\\repos\\数据结构实训\\text.txt", "r");
if (fp == NULL)
{
printf("文件无法打开");
system("pause");
return;
}
//循环读取
while(fgets(buf, 1024, fp) != NULL)
{
//fscanf(fp, "%s\n", buf);
printf("%s", buf);
}
fclose(fp);
//关闭文件,每次文件操作完后记得关闭,否则会在下一次文件操作时产生乱码等问题
fp = NULL;
}
void OpenOneFile()
{
FILE* fp;
printf("请输入要打开的文件名字\n");
scanf("%s", FileName);
//拼接path+filename,形成最终的文件路径
sprintf(path1, "%s%s", path, FileName);
fp = fopen(path1, "r");
if (fp == NULL)//判断打开的文件是否为空,空则报错
{
printf("打开失败\n");
system("pause");
return;
}
else
{
printf("打开成功\n");
}
}
int PassWord()
{
char spass[10] = " ";
printf(" 请输入登录密码:\n");
printf(" ");
scanf("%s", spass);
i = strcmp(password, spass);
return i;
}
int FindStringApearCountHelp(char* str, int* count, char T[])
{
int i = 0;
char* tmp = str;
//strstr()函数用于找到子串在一个字符串中第一次出现的位置
while (tmp = strstr(tmp, T))
{
// 能进来,肯定有匹配的子串
// 重新设置查找起点
tmp = tmp + strlen(T);
i++;
if (*tmp == '\0') // 如果到结束符
{
break;
}
}
*count = i;
return 0;
}
int FindStringApearCount(char S[], int count, char T[])
{
int index;
index = FindStringApearCountHelp(S, &count, T);
return count;
}
int main()
{
//初始化窗口
system("COLOR F0");
system("title BF、KMP算法实现");
system("mode con cols=37 lines=30");
//密码
while (true)
{
int j;
j = PassWord();
if (!i)
{
printf(" 密码正确!\n");
break;
}
else
printf(" 密码错误,请重新输入密码\n");
}
system("pause");
system("cls");
int select = 0; //用户选择
//初始化
sstring.str1 = (char*)malloc(sizeof(char) * MaxSize);
sstring.length = 0;
while (true)
{
ShowMenu();
while (1)
{
printf("请输入您的选择(0-7)\n");
scanf("%d", &select);
if (select >= 0 && select <= 7)
{
break;
}
}
switch (select)
{
case 1:
printf("请输入文件名字\n");
CreateFileX();
system("pause");
system("cls");
break;
case 2:
printf("文件内容为:\n");
ShowFile();
system("pause");
system("cls");
break;
case 3:
printf("请输入要添加的文本内容");
AddFile();
break;
case 4:
#ifdef DEBUG_BF
printf("请输入模式串:");
scanf("%s", str2);
printf("模式串为:\n");
printf("%s\n", str2);
if (FindStringBf(sstring.str1, str2) != 0)
{
printf("BF算法匹配的开始位置的下标:");
printf("%d\n", FindStringBf(sstring.str1, str2));
}
else
{
printf("模式串不存在,BF匹配失败\n");
}
#endif
#ifdef DEBUG_KMP
if (FindStringKmp(sstring.str1, str2) != 0)
{
printf("KMP算法匹配的开始位置的下标:");
printf("%d\n", FindStringKmp(sstring.str1, str2));
}
else
{
printf("模式串不存在,KMP匹配失败\n");
}
printf("该单词出现的次数");
printf("%d\n", FindStringApearCount(sstring.str1, i, str2));
system("pause");
system("cls");
break;
#endif
case 5:
printf("总文件表为:\n");
ShowAllFileName();
system("pause");
system("cls");
break;
case 6:
StringLength();
system("pause");
system("cls");
break;
case 7:
OpenOneFile();
system("pause");
system("cls");
break;
case 0:
//释放内存
free(sstring.str1);
exit(0);
break;
}
}
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。