文本编辑器

简易文本编辑器


           文本编辑器是我们常用的应用软件,本文用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.部分功能测试结果

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值