C++简单文本编辑器代码

#include<iostream>
#include<string>
#include<cstdlib>
#include<ctype.h>
#include<cstdio>
#include<fstream>
using namespace std;
int NumberCount=0;//数字个数
int CharCount=0;//字母个数
int PunctuationCount=0;//标点符号个数
int BlankCount=0;//空白符个数
 
class Node
{
public:
    string character;
    int cursor;
    int offset;
    Node* next;
    Node(){
        cursor=0;//每行的光标初始位置
        offset=0;//每行的初始偏移位置
        next=NULL;
    }
};
 
class TextEditor
{
private:
    Node* head;
    string name;
    int line;//可更改的行数
    int length;//行数
public:
    TextEditor();
    ~TextEditor();
    string GetName();
    void SetName(string name);
    int GetCursor();
    int MoveCursor(int offset);
    int SetCursor(int line,int offset);
    void AddText(const string s);
    void InsertText(int seat,string s);
    int FindText(string s);
    void DeleteText(string s);
    int GetLine();
    void Count();
    friend ostream& operator<<(ostream& out,TextEditor &text);
    Node* Gethead(){
        return head;
    }
    //int GetLength()
    //{
   //     return length;
   // }
  //  int FindText(string s);
  //  void DeleteText(int seat,string s);
};
 
TextEditor::TextEditor()
{
    head=NULL;
    name="test";//文件初始名
    //tail=NULL;
    line=1;
    length=0;
}
 
TextEditor::~TextEditor()
{
    Node* p=head;
    Node* q;
    while(p!=NULL){
        q=p->next;
        delete p;
        p=q;
    }
 
}
 
int TextEditor::GetLine()
{
    return line;
}
 
string TextEditor::GetName()
{
    return name;
}
 
void TextEditor::SetName(string name)
{
    this->name=name;
}
 
int TextEditor::GetCursor()
{
    Node *p=head;
    while(p->next!=NULL)
        p=p->next;
    return p->cursor;
}
 
int TextEditor::MoveCursor(int offset)
{
    Node *p=head;
    int i=1;
    if(length+1<line){
        cout<<"输入错误!"<<endl;
        exit(0);
    }
    else{
        while(p->next!=NULL&&i<line){
            p=p->next;
            i++;
        }
    }
    if(offset>p->character.length()){
        cout<<"移动位置太大!"<<endl;
        exit(0);
    }
    else
       p->cursor+=offset;
    //cout<<"p  ->cursor="<<p->cursor<<endl;
    return p->cursor;
}
 
int TextEditor::SetCursor(int line,int offset)
{
    this->line=line;
   //cout<<"line="<<this->line<<endl;
    return MoveCursor(offset);
}
 
void TextEditor::AddText(const string s)
{
    line=length+1;
    Node* p=new Node;
    Node* q=head;
    p->character=s;
    p->next=NULL;
    if(head==NULL)
        head=p;
    else{
        while(q->next!=NULL)
            q=q->next;
        q->next=p;
    }
 
        length++;
       // line++;
}
 
void TextEditor::InsertText(int seat,string s)
{
    Node *p=head;
    int i=1;
    if(length+1<line){
        cout<<"输入错误!"<<endl;
        exit(0);
    }
    else{
        while(p->next!=NULL&&i<line){
            p=p->next;
            i++;
        }
    }
    //MoveCursor(seat);
    //cout<<"p->cursor="<<p->cursor<<endl;
    string substr;
    for(int i=seat;i<s.length()+seat&&i<=p->character.length();i++)
    substr+=p->character[i];
 
    p->character.insert(p->cursor,s);
 
 
    cout<<"substr="<<substr<<endl;
    DeleteText(substr);//覆盖子串
    p->cursor=0;//光标清零
}
 
ostream& operator<<(ostream& out,TextEditor &text)
{
    int i=1;
    Node* p=text.Gethead();
    while(p!=NULL){
        out<<p->character<<endl;
        p=p->next;
    }
   // cout<<"length="<<text.GetLength()<<endl;
    return out;
}
 
int TextEditor::FindText(string P)
{
    Node* q=head;
    //int templine=1;
    line=1;
    int p=0;
    int t=0;
    int plen=P.length()-1;
    //cout<<"P="<<P<<endl;
    //cout<<"plen="<<plen<<endl;
    int tlen=q->character.length();
    while(q!=NULL){
            p=0;
            t=0;
        tlen=q->character.length();
        if(tlen<plen){
            line++;
             q=q->next;
        }
 
        while(p<plen&&t<tlen){
            if(q->character[t]==P[p]){
                t++;
                p++;
            }
            else{
                t=t-p+1;
                p=0;
            }
        }
      //  cout<<"P="<<P<<endl;
      //  cout<<"p="<<p<<endl;
      //  cout<<"plen="<<plen<<endl;
        if(p>=plen){
 
            return t-plen+1;
        }
 
 
        else{
            line++;
            q=q->next;
        }
 
    }
    return -1;
}
 
void TextEditor::DeleteText(string s)
{
    Node *p=head;
    int i=1;
    int k=FindText(s);
    if(k==-1)
        cout<<"未出现该字符串!"<<endl;
    else{
        while(p!=NULL&&i<line){
            p=p->next;
           // cout<<p->character<<endl;
            i++;
        }
 
        p->character.erase(k-1,s.length());
        cout<<"删除成功!"<<endl;
    }
}
 
void TextEditor::Count()
{
    Node *p=head;
    NumberCount=0;
    CharCount=0;
    PunctuationCount=0;
    BlankCount=0;
    while(p!=NULL){
            for(int i=0;i<p->character.length();i++){
                if(p->character[i]>='0'&&p->character[i]<='9')
                    NumberCount++;
                else if(p->character[i]>'a'&&p->character[i]<'z'||p->character[i]>'A'&&p->character[i]<'Z')
                    CharCount++;
                else if(ispunct(p->character[i]))
                    PunctuationCount++;
                else if(p->character[i]==' ')
                    BlankCount++;
            }
            p=p->next;
    }
}
 
int main()
{
    int i,j,k;string n;
    string s,t,name;
    TextEditor text;
    cout<<"Append -> 添加字符"<<endl;
    cout<<"Set_File_Name -> 设置文档名字"<<endl;
    cout<<"File_Name -> 获取文档名字"<<endl;
    //cout<<"Cursor_Position -> 显示光标位置"<<endl;
    cout<<"Insert_Text_At_Cursor -> 设置光标位置,在光标位置处插入文本"<<endl;
    cout<<"Find_Text_Of_Document -> 在文档中查找文本"<<endl;
    cout<<"Delete_Text -> 在文档中删除文本"<<endl;
    cout<<"Input_Text -> 输入文本"<<endl;
    cout<<"Exit -> 退出"<<endl;
    while(true){
        cout<<endl;
        cout<<text.GetName()<<"\\"<<">";
        getline(cin,n);
        if(n=="Append"){
        	cout<<"请输入字符:"; getline(cin,s,'\n'); text.AddText(s);
		}if(n=="Set_File_Name"){
			cout<<"请输入文档名字:"; cin>>name; text.SetName(name);
		}if(n=="File_Name"){
			cout<<text.GetName()<<endl;
		}/*if(n=="Cursor_Position"){
			cout<<"光标在第"<<text.GetLine()<<"行,第"<<text.GetCursor()<<"个字符前!"<<endl;
		}*/if(n=="Insert_Text_At_Cursor"){
			cout<<"输入行数:";
            cin>>i;
            cout<<"光标在第"<<text.GetCursor()<<"个字符前!"<<endl;
            cout<<"输入移动位数:";
            cin>>j;
            cout<<"输入插入字符:";
            getchar();
            getline(cin,s);
            text.InsertText(text.SetCursor(i,j),s);
		}if(n=="Find_Text_Of_Document"){
            cout<<"输入查找的字符串:";
            getline(cin,s);
            int k=text.FindText(s);
            if(k==-1)
                cout<<"查找失败!"<<endl;
            else
                cout<<"所查找文本首次出现在:"<<text.GetLine()<<"行,第"<<k<<"个字符处!"<<endl;
		}if(n=="Delete_Text"){
			cout<<"输入要删除的字符串:"; getline(cin,s); text.DeleteText(s);
		}if(n=="Input_Text"){
			cout<<text;
		}if(n=="Exit"){
			string ss=text.GetName();
            ss+=".txt";
            cout<<ss<<endl;
            ofstream outFile(ss.c_str());
            Node* p=text.Gethead();
            while(p!=NULL){
                outFile<<p->character<<endl;
                p=p->next;
            }
            exit(0);
		}
    }
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值