C++实现简易文本编辑器

本文实例为大家分享了C++实现文本编辑器的具体代码,供大家参考,具体内容如下

1.简易文本编辑器

2.用链表实现,保存到文件中

#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,n=2;
  string s,t,name;
  TextEditor text;
  cout<<"---------------------------------------"<<endl;
  cout<<"1.添加字符"<<endl;
  cout<<"2.设置文档名字"<<endl;
  cout<<"3.获取文档名字"<<endl;
  cout<<"4.显示光标位置"<<endl;
  cout<<"5.设置光标位置,在光标位置处插入文本"<<endl;
  cout<<"6.在文档中查找文本"<<endl;
  cout<<"7.在文档中删除文本"<<endl;
  cout<<"8.统计字母、数字、标点符号、空白符号及总字符个数"<<endl;
  cout<<"9.输入文本"<<endl;
  cout<<"0.退出"<<endl;
  while(n){
    // cout<<endl;
    cout<<endl;
    cout<<"---------------------------------------"<<endl;
    cout<<"请输入:";
    cin>>n;
    getchar();
    switch(n){
      case 1: cout<<"请输入字符:"; getline(cin,s,'\n'); text.AddText(s); break;
      case 2: cout<<"请输入文档名字:"; cin>>name; text.SetName(name); break;
      case 3: cout<<text.GetName()<<endl; break;
      case 4: cout<<"光标在第"<<text.GetLine()<<"行,第"<<text.GetCursor()<<"个字符前!"<<endl; break;
      case 5:{
        cout<<"输入行数:";
        cin>>i;
        cout<<"光标在第"<<text.GetCursor()<<"个字符前!"<<endl;
        cout<<"输入移动位数:";
        cin>>j;
        cout<<"输入插入字符:";
        getchar();
        getline(cin,s);
        text.InsertText(text.SetCursor(i,j),s); break;
      }
      case 6: {
        cout<<"输入查找的字符串:";
        getline(cin,s);
        int k=text.FindText(s);
        if(k==-1)
          cout<<"查找失败!"<<endl;
        else
          cout<<"所查找文本首次出现在:"<<text.GetLine()<<"行,第"<<k<<"个字符处!"<<endl;
          break;
      }
      case 7: cout<<"输入要删除的字符串:"; getline(cin,s); text.DeleteText(s); break;
      case 8: {
        text.Count();
        cout<<"文档中共有:"<<endl;
        cout<<NumberCount<<"个数字"<<endl;
        cout<<CharCount<<"个字母"<<endl;
        cout<<PunctuationCount<<"个标点符号"<<endl;
        cout<<BlankCount<<"个空白字符"<<endl;
        cout<<"共有"<<NumberCount+CharCount+PunctuationCount+BlankCount<<"个字符!"<<endl;
        break;
      }
      case 9: cout<<text; break;
      case 0:{
        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);
        break;
      }
      default: cout<<"输入错误,请重新输入!"<<endl; break;
    }

  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • VC++中HTControl控件类之CHTRichEdit富文本编辑控件实例

    本文所述CHTRichEdit控件类继承自CRichEditCtrl,为了避免CRichEditCtrl的界面风格与CRichEditCtr的滚动条不相协调,因此在CHTRichEdit控件中去掉了CRichEditCtrl的默认滚动条,替换成自己绘制的滚动条,这样就不会破坏整体外观了.替换的滚动条并不需要与默认的滚动条同样的宽度,不受操作系统主题的影响,可以支持任意的宽度,而且在不需要滚动条时它会自动消失,使软件布局不会受到影响. 具体实现代码如下: #if !defined(__CHTRic

  • 一个的简易文本编辑器源码

    一个简易文本编辑器,自己学习的第一个编辑器程序,共享一下,可以学习一下. ubb //initialize the iframe function window.onload() { Editor.document.designMode = "On"; Editor.document.open() ; Editor.document.write("") ; Editor.document.close(); Editor.focus (); } function On

  • C++实现简易文本编辑器

    本文实例为大家分享了C++实现文本编辑器的具体代码,供大家参考,具体内容如下 1.简易文本编辑器 2.用链表实现,保存到文件中 #include<iostream> #include<string> #include<cstdlib> #include<ctype.h> #include<cstdio> #include<fstream> using namespace std; int NumberCount=0;//数字个数 in

  • C语言实现简易文本编辑器

    本程序要求完成一个简易文本编辑器,能够完成文本的录入.编辑.删除.查找,并能够完成文件的存取. 在文本编辑软件中把用户输入的所有文本内容作为一个字符串.虽然各种文本编辑软件的功能有强弱差别,但是基本操作都包括串的输入.修改.删除(包括整行删除和一行中的子串删除).查找.输出等.通过分析,系统应该包括以下功能: 1.具有简单的文字或图形菜单界面 2.能实现串或文本块的查找.替换.删除.插入.移动操作. 3.能实现文本文件的存盘和读取功能. 4.具有友好的界面和较强的容错能力 设计思路 1.采用的逻

  • C语言实现简易文本编译器

    数据结构课程设计之简易文本编译器(C语言实现) 需求分析 (1)具有图形菜单界面:显示实时年份,日期,星期及时间 (2) 查找:查找文本中的字符串,显示其出现的行数,列数及总共出现次数 替换(等长,不等长):对文本中的文本实现等长及不等长替换 插入(插串,文本块的插入):插入一行或在具体行号列号处插入文本 块移动(行块,列块移动):向下移动一行,向上移动一行, 具体行号列号处向左移动或向右移动 删除:删除一行,删除莫一行,莫列,定长的内容 (3)可正确存盘.取盘::可读取,保存文本: (4)正确

  • ASP.NET网站使用Kindeditor富文本编辑器配置步骤

    1. 下载编辑器 下载 KindEditor 最新版本,下载页面: http://www.kindsoft.net/down.php 2. 部署编辑器 解压 kindeditor-x.x.x.zip 文件,将editor文件夹复制到web目录下  3.在网页中加入(ValidateRequest="false") 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" Validat

  • javascript 在线文本编辑器实现代码

    Editor body{ font-size:12px;} #ed{ height:300px; width:800px; background-color: } .sssss{ background-image:url(http://www.zzsky.cn/build/images/20099493121.gif)} .tag{ background-image:url(http://www.zzsky.cn/build/images/20099493121.gif);height:22px

  • xheditor所见即所得文本编辑器(代码高亮显示修改)

    所见即所得的文本编辑器目前在网上流传的已经有很多了,并且都比较优秀,就我个人而言,用过的有以下几个:     · 第一个接触的是ewebeditor,用在我的毕业设计里面,那时候是顺便选的,对这类东西也没什么了解,现在这个编辑器已经相当猛了:     · 后来工作中用了FCKEdier,原因很简单,这个文本编辑器已经有相应的asp.net服务器端控件,封装得很棒,不过毕竟是封装好了的控件,存在着一定的局限,而且目前这个文本编辑器已经全面改版,并且现在的名字叫CKEdier,现在所在公司的项目也是

  • 分享10个程序员常用的的代码文本编辑器

    通常操作系统和软件开发包中都包含文本编辑器,可以用来编辑配置文件,文档文件和源代码. 下面是笔者总结的10个最好的免费代码文本编辑器: 1.NOTEPAD++ NOTEPAD++是一款免费又优秀的文本编辑器,支持在MS Windows环境下运行的多种编程语言.NOTEPAD++支持超过50种编程.脚本和标记语言的语法高亮显示和代码折叠,能让用户迅速减小或扩大代码段以便查阅整个文档.用户也可以手动设置当前语言,覆盖默认语言.该程序还支持自动完成某些编程语言的API子集. 官方网站:http://n

  • Vue.js结合Ueditor富文本编辑器的实例代码

    在前端开发的项目中.难免会遇到需要在页面上集成一个富文本编辑器. 前一段时间公司Vue.js项目需要使用UEditor富文本编辑器,在百度上搜索一圈没有发现详细的说明,决定自己尝试,忙活了一天终于搞定了. 1. 总体思路 1.1 模块化 vue的很大的一个优势在于模块化,我们可以通过模块化实现页面和逻辑的复用.所以可以把Ueditor重新封装成一个.vue的模板文件.其他组件通过引入这个模板实现代码复用. 1.2 数据传输 首先父组件需要设置编辑器的长度.宽度.初始文本,这些数据可以通过prop

  • iOS实现富文本编辑器的方法详解

    前言 富文本编辑器不同于文本编辑器,国内做的比较好的比如有百度的UEditor和kindEditor.但是这两个也有它的缺点:界面过于复杂.不够简洁.UI设计也比较落后.不够轻量化,这篇文章我们将给大家介绍利用iOS如何实现富文本编辑器. 实现的效果 解决思路 采用webview加载一个本地html文件,该html内部编写好js方法用于与oc相互调用 最终输出该富文本字符串传输给服务器 为什么选择这样的方式 服务端要求我最终返回的数据格式为: { @"Id":"当时新建模板这

随机推荐