简易文本编辑器
文本编辑器是我们常用的应用软件,本文用C/C++语言实现了对指定文件内容进行清空、查找、删除、插入、替换、保存的基本功能。
1.模块划分与设计
本文利用数组的形式,将文件的内容读取到数组内,相应的操作也就转变为对数组的操作,进行保存时只需将当前数组中的内容写回文本即可。
根据文本编辑器要实现的功能,将其划分为以下几个模块:
(1)清空文件内容:通过将数组中的内容将清空然后写回文本来实现清空文件的功能;
void Clear(char text[]);
(2)显示文本信息:遍历数组内容,并输出;
void show(char text[]);
(3)查找功能:查找文本中的指定信息,运用模式匹配,查找指定信息在文本中的行和列,以此实现查找功能。下面的删除、插入、替换功能的实现都是基于此功能。
int match(char text[],char t[],int len,int l); //模式匹配
int Search(char text[],int l);
(4)删除功能:通过移动数组中元素向前移动位置,实现删除功能。
void Replace(char text[],int l);
(5)插入功能:通过移动数组中元素向后移动位置,实现插入功能。
void Insert(char text[],int l);
(6)替换功能:替换过程中,在移动数组中元素时,需要注意要替换的信息与被替换的信息的长度大小关系,大小不同移动的方式不同。
void Replace(char text[],int l);
(7)保存功能:将数组中的内容写回文本中。
void Save(char text[]);
(8)退出:结束主函数运行。退出时要注意文本内容是否保存,若未保存,应对用户进行提示。
void Exit(int save_num);
从上面可以看出,该程序设计的主要算法是模式匹配,本文中采用的是暴力搜索,可用KMP算法对该程序进行改进。
2.程序流程
3.代码
#include<iostream>
#include <string.h>
#define MAX 999
int save_num=0; // 0 未保存 1 已保存
int ntext=0;
char text[MAX];
char name[30]=""; //文件名
void menu(); //主界面
void Open(char text[]); //打开文件
void show(char text[]); //打印文件内容
void Clear(char text[]); //清空文件内容
int match(char text[],char t[],int len,int l); //模式匹配
int Search(char text[],int l); //查找文件内容
void Insert(char text[],int l); //插入新内容
void Delete(char text[],int l); //删除
void Replace(char text[],int l); //替换
void Save(char text[]); //保存文件
void Exit(int save_num); //退出
using namespace std;
int main()
{
Open(text);
return 0;
}
void menu()
{
loop:
system("cls");
cout<<" 简易文本编辑器"<<endl;
cout<<" 1.清空文件"<<endl;
cout<<" 2.查找"<<endl;
cout<<" 3.插入"<<endl;
cout<<" 4.删除"<<endl;
cout<<" 5.替换"<<endl;
cout<<" 6.显示内容"<<endl;
cout<<" 7.保存"<<endl;
cout<<" 0.退出"<<endl;
cout<<"-----------------------------"<<endl;
cout<<" 输入选项(0-8):";
int n;cin>>n;
if(n>=0&&n<=7)
{
switch(n)
{
case 1:Clear(text);break;
case 2:Search(text,0);break;
case 3:Insert(text,0);break;
case 4:Delete(text,0);break;
case 5:Replace(text,0);break;
case 6:show(text);break;
case 7:Save(text);break;
case 0:Exit(save_num);break;
}
}
else
{
cout<<"输入有误,按任意键返回..."<<endl;
fflush(stdin);
getchar();
goto loop;
}
cout<<"按任意键返回主菜单..."<<endl;
fflush(stdin);
getchar();
goto loop;
}
void Open(char text[])
{
system("cls");
FILE *fp;
int i=0;char ch;
cout<<"输入打开的文件名(如:c:\\a.txt):";
re:
scanf("%s",name);
while((fp=fopen(name,"r"))==NULL)
{
cout<<"打开文件失败,请重新输入文件名:";
goto re;
}
while(!feof(fp))
{
ch=fgetc(fp);
text[i]=ch;
++i;
}
text[i]='\0';
ntext=i;
fclose(fp);
cout<<"文件读取成功,按任意键继续..."<<endl;
fflush(stdin);
getchar();
menu();
}
void show(char text[])
{
system("cls");
int hang=1;
cout<<"现在文本内容为:"<<endl;
for(int i=0;i<ntext;i++)
{
cout<<text[i];
if(text[i]=='\n')
hang++;
}
cout<<endl;
cout<<"文本共有"<<hang<<"行"<<endl;
}
void Clear(char text[])
{
for(int i=0;i<ntext;i++)
text[i]='\0';
ntext=0;
save_num=0;
}
void Exit(int save_num)
{
system("cls");
if(save_num)
exit(0);
else
{
cout<<"文件还未保存,是否退出?"<<endl;
cout<<"A.直接退出 B.保存并退出"<<endl;
char a;cin>>a;
if(a=='B')
{
Save(text);
}
exit(0);
}
}
void Save(char text[])
{
system("cls");
FILE *fp;
fp=fopen(name,"w+");
for(int i=0;i<ntext;i++)
fprintf(fp,"%c",text[i]);
fclose(fp);
save_num=1;
cout<<"文件保存成功"<<endl;
}
int match(char text[],char t[],int len,int l)
{
int l1=l,i=0;
while(l1<ntext&&i<len)
{
if(text[l1]==t[i])
{
++l1;
++i;
}
else
{
l1=l1-i+1;
i=0;
}
}
if(i>=len)
return (l1-len); //返回匹配的第一个字符下标
else
return -1; //匹配失败
}
int Search(char text[],int l)
{
system("cls");
show(text);
int len,a,len1;
cout<<"输入要查找的内容:"<<endl;
char t[30];
scanf("%s",t);
len=strlen(t);
len1=strlen(text);
re:
int hang=1,lie=1;
a=match(text,t,len,l);
if(a==-1)
{
cout<<"未查找到该内容"<<endl;
cout<<"A.继续查找 B.结束查找"<<endl;
char s;cin>>s;
if(s=='A')
{
l==0;Search(text,l);
}
else if(s=='B')
return 0;
}
else if(a!=-1)
{
l=a+len;
for(int i=0;i<a;++i)
{
++lie;
if(text[i]=='\n')
{
++hang;lie=1;
}
}
cout<<"该内容在第"<<hang<<"行第"<<lie<<"列"<<endl;
cout<<"A.查找下一处 B.结束查找"<<endl;
char s1;cin>>s1;
if(s1=='A')
{
if(l==len1-1){
cout<<"返回到文件开头第一个位置"<<endl;
l=0;
}
goto re;
}
else if(s1=='B')
return 0;
}
}
void Insert(char text[],int l)
{
system("cls");
int len,len1,a;
show(text);
cout<<"输入您要在哪个内容前插入:"<<endl;
re:
char t[30];
scanf("%s",t);
len=strlen(t);
len1=strlen(text);
rs:
int hang=1,lie=1;
a=match(text,t,len,l);
if(a==-1)
{
cout<<"未查找到该内容,请重新输入"<<endl;
goto re;
}
else if(a!=-1)
{
l=a+len;
for(int i=0;i<a;++i)
{
++lie;
if(text[i]=='\n')
{
++hang;lie=1;
}
}
cout<<"是否在第"<<hang<<"行第"<<lie<<"列前插入内容"<<endl;
cout<<"A.否,查找下一处 B.是"<<endl;
char s1;cin>>s1;
if(s1=='A')
{
if(l==len1-1){
cout<<"返回到文件开头第一个位置"<<endl;
l=0;
}
goto rs;
}
else if(s1=='B')
{
cout<<"输入插入的内容:"<<endl;
char t2[30];int len2;
scanf("%s",t2);
len2=strlen(t2);
for(int i=ntext;i>=a;i--)
text[i+len2]=text[i];
for(int j=0;j<len2;j++)
text[j+a]=t2[j];
ntext=ntext+len2;
cout<<"插入完成"<<endl;
save_num=0;
}
}
}
void Delete(char text[],int l)
{
system("cls");
int len,len1,a;
show(text);
cout<<"输入您要删除的内容:"<<endl;
re:
char t[30];
scanf("%s",t);
len=strlen(t);
len1=strlen(text);
rs:
int hang=1,lie=1;
a=match(text,t,len,l);
if(a==-1)
{
cout<<"您删除的内容不存在,请重新输入"<<endl;
goto re;
}
else if(a!=-1)
{
l=a+len;
for(int i=0;i<a;++i)
{
++lie;
if(text[i]=='\n')
{
++hang;lie=1;
}
}
cout<<"是否删除在第"<<hang<<"行第"<<lie<<"列的内容"<<endl;
cout<<"A.否,查找下一处 B.是"<<endl;
char s1;cin>>s1;
if(s1=='A')
{
if(l==len1-1){
cout<<"返回到文件开头第一个位置"<<endl;
l=0;
}
goto rs;
}
else if(s1=='B')
{
for(int i=a;i<ntext;++i)
text[i]=text[i+len];
ntext=ntext-len;
cout<<"删除完成"<<endl;
save_num=0;
}
}
}
void Replace(char text[],int l)
{
system("cls");
int len,len1,a;
show(text);
cout<<"请输入被替换内容:"<<endl;
re:
char t[30];
scanf("%s",t);
len=strlen(t);
len1=strlen(text);
rs:
int hang=1,lie=1;
a=match(text,t,len,l);
if(a==-1)
{
cout<<"未查找到该内容,请重新输入"<<endl;
goto re;
}
else if(a!=-1)
{
l=a+len;
for(int i=0;i<a;++i)
{
++lie;
if(text[i]=='\n')
{
++hang;lie=1;
}
}
cout<<"是否替换在第"<<hang<<"行第"<<lie<<"列的内容"<<endl;
cout<<"A.否,查找下一处 B.是"<<endl;
char s1;cin>>s1;
if(s1=='A')
{
if(l==len1-1){
cout<<"返回到文件开头第一个位置"<<endl;
l=0;
}
goto rs;
}
else if(s1=='B')
{
cout<<"输入要替换的内容:"<<endl;
char t2[30];int len2;
scanf("%s",t2);
len2=strlen(t2);
if(len2>=len)
{
for(int i=ntext;i>=a+len;i--)
text[i+len2-len]=text[i];
for(int j=0;j<len2;j++)
text[j+a]=t2[j];
ntext=ntext+len2-len;
}
else
{
for(int i=a+len2;i<ntext;++i)
text[i]=text[i+len];
for(int j=0;j<len2;j++)
text[j+a]=t2[j];
}
ntext=ntext-len+len2;
cout<<"替换完成"<<endl;
save_num=0;
}
}
}
4.部分功能测试结果