简单文本编辑器.docx_第1页
简单文本编辑器.docx_第2页
简单文本编辑器.docx_第3页
简单文本编辑器.docx_第4页
简单文本编辑器.docx_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

简单文本编辑器()一、功能要求1、 具有图形菜单界面;2、 查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除3、 可正确存盘、取盘;4、正确显示总行数。二、主程序流程图三、数据结构程序中用链表来保存文本,每一行为一个单向链表,每一行的表头保存在一个行链表中,形成了一个2维链表,结构如下图所示:四、功能实现1. 打开文件(1) 提示用户输入文件路径(2) 判断文件路径是否有效,若无效,则提示错误信息并返回,否则继续执行。(3) 若文件成功打开并且文件指针没有到文件尾,则从文件中一次读取一个字符,并将该字符添加到一列单链表节点中,直至遇到换行符(ASCII码10)。当列单链表形成后,它的首地址将被保存至行单链表的相应节点的数据域中,如此动作,直至文件指针指向文件尾部而结束。2. 新建文件(1) 若行链表中有数据存在,则提示用户保存文件。(2) 提示用户输入新建文件的保存路径。(3) 测试新文件路径是否有效。3. 保存文件(1) 打开文件。(2) 遍历行单链表,遍历行单链表节点指向的列单链表,并将数据输出到文件,每个列单链表遍历完后,输出换行符到文件。(3) 关闭文件4. 插入字符串(1) 提示用户输入要插入字符串的位置(行号row,列号col)以及要插入的字符串。(2) 先在行单链表中找到该行(第row行),若超出现有行数,则添加空行补齐;(3) 将字符串插入该行(第row行)节点指向的列链表中的col-1位置,若超出现有节点数,则添加保存字符为空格的节点补齐。5. 删除字符串(1) 提示用户输入要删除字符串的开始位置(行号row,列号col)以及要插入的字符串的长度len。(2) 在链表中定位到该行节点,若不存在,则提示无法删除并返回;否则继续执行。(3) 在该行中定位到该col字符节点node,若不存在,则提示无法删除并返回;否则继续执行。(4) 删除从node字符节点开始的len个节点。若不满len个,则全部删除。6. 查找替换(1) 提示用户输入要查找的字符串。(2) 遍历链表,找到每一个出现此字符串的位置并输出。(3) 询问用户是否要进行替换。若选是,则提示用户输入要替换后的字符串,然后先在链表中删除原字符串,再在该位置插入要替换为的字符串。7. 行移动(1) 提示用户输入要移动的行row和移动后的位置pos。(2) 将行链表中的row-1节点移动到pos-1位置。8. 列移动(1) 提示用户输入要移动的列col和移动后的位置pos。(2) 遍历每一行(列链表),将每一行的col-1节点移动到pos位置处;若col-1节点不存在则不处理。9. 显示文本(1) 遍历行、列链表,并将数据输出到控制台;五、代码实现#include #include #include using namespace std;/author: yyc /1、 具有图形菜单界面;/2、 查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除/3、 可正确存盘、取盘;/4、正确显示总行数。/字符节点struct Nodechar ch;Node* next;/行节点struct RowNode* line;Row* next;/创建一个Node对象Node* createNode(char ch)Node* p = new Node;p-ch=ch;p-next=NULL;return p;/创建一个Row对象Row* createRow(Node* line)Row* p=new Row;p-line=line;p-next=NULL;return p;/定位到index处Node* locate(Node* line,int index)Node* p=line;int i=-1;while(p!=NULL&inext;i+;return p;Row* locate(Row* list,int index)Row* p=list;int i=-1;while(p!=NULL&inext;i+;return p;/插入节点bool insert(Node* list,int index,char c)Node* p= locate(list,index-1);if(p)Node* node=createNode(c);node-next=p-next;p-next=node;return true;return false;bool insert(Row* list,int index,Node* line)Row* p= locate(list,index-1);if(p)Row* row=createRow(line);row-next=p-next;p-next=row;return true;return false;/删除节点bool remove(Node* list,int index)Node* p=locate(list,index-1);Node* q=NULL;if(p&p-next)q = p-next;p-next=q-next;delete q;return true;return false;/清空链表void clear(Node* line)Node* p=line-next;Node* q;while(p)q=p-next;delete p;p=q;bool remove(Row* list,int index)Row* p=locate(list,index-1);Row* q=NULL;if(p&p-next)q = p-next;p-next=q-next;clear(q-line); /清空字符链表delete q-line; /删除字符链表表头delete q;return true;return false;void clear(Row* text)Row* p=text-next;Row* q;while(p)q=p-next;clear(p-line);delete p-line; /删除字符链表表头delete p;p=q;void Line(int i)if(i=1)cout-endl;else if(i=2)cout=c;if(c=Y|c=y)return 1;else if(c=N|c=n)return 0;return -1;/主菜单void Menu()cout*endl;cout* 简单文本编辑器 *endl;cout*endl;coutt1.打开文件endl;coutt2.新建文件endl;coutt3.保存文件endl;coutt4.插入字符串endl;coutt5.删除字符串endl;coutt6.查找替换endl;coutt7.行移动endl;coutt8.列移动endl;coutt9.显示文本endl;coutt0.退出endl;Line(1);/输出当前文本void PrintText(Row* text)coutendl;Line(2);cout当前文本为:next;Node* q;int i=0;while(p!=NULL)i+;cout行iline-next;while(q!=NULL)coutch;q=q-next;coutnext;Line(1);cout总共 i 行endl;Line(2);/打开文件bool OpenFile(char * fileName,Row* text)ifstream file(fileName,ios:in);if(!file)cout文件读取失败!next=NULL;Node* p=line;file.get(c);while(c!=10&!file.eof()Node* q=createNode(c);q-next=NULL;p-next=q;p=p-next;file.get(c);if(!file.eof()Row* rq = createRow(line);rp-next=rq;rp=rp-next;file.close();cout文件读取完成!endl;return true;/创建文件bool CreateFile(const char * fileName,Row* text)ofstream file(fileName);if(!file)cout文件创建失败!endl;return false;file.close();cout文件创建成功!endl;return true;/保存bool SaveFile(const char * fileName,Row* text)ofstream file(fileName);if(!file)cout文件保存失败!next;Node* q=NULL;while(p!=NULL)q = p-line-next;while(q!=NULL)/if(q-data=n)filech;q=q-next;filenext;file.close();cout文件保存成功!next&inext;i+;while(inext=rq;rp=rp-next;i+;np=rp-line;while(np-next&jnext;j+;while(jnext=nq;np=np-next;j+;cin.get();string s;getline(cin,s);for(int k=0;knext=np-next;np-next=nq;np=np-next;/行移动bool MoveRow(Row* text,int row,int poz)if(row=poz)return true;Row* p=locate(text,row-1);Row* t=locate(text,poz-1);Row* q;if(p&p-next&t)q=p-next;p-next=q-next;q-next=t-next;t-next=q;return true;return false;/列移动void MoveCol(Row* text,int col,int poz)if(col=poz)return;Row* rp=text-next;while(rp)Node* np=locate(rp-line,col-1);Node* nt=locate(rp-line,poz-1);Node* nq;if(np&np-next&nt)nq=np-next;np-next=nq-next;nq-next=nt-next;nt-next=nq;rp=rp-next;/查找替换void FindStr(Row* text)string str,rep;int pos,k=0,row=1,col=0;cout请输入你要查找的字符串:str;Row* p=text-next;while(p)string line;Node* nq=p-line-next;while(nq)line.append(1,nq-ch);nq=nq-next;pos=line.find(str.c_str(),0);while(pos!=string:npos)col=pos;k+;coutstr 第k次出现的位置是:第row行,第col+1列endl;cout是否替换?(Y/N) ;int yon=YesOrNo();while(yon=-1)cout是否替换?(Y/N) ;yon=YesOrNo();if(yon=1)cout将 strrep;int j;for(j=0;jline,col);for(j=0;jline,col+j,repj);cout替换成功!next;if(k=0)cout当前文本中找不到该字符串!endl;void DelStr(Row* text,int row,int col,int len)Row* rp = locate(text,row);if(rp=NULL)cout无法删除,因为该位置没有字符串!line,col-1);if(np=NULL)cout无法删除,因为该位置没有字符串!next;string s;int k=0;while(nq&kch);np-next=nq-next;delete nq;nq=np-next;k+;cout成功删除字符串 snext=NULL;string fileName;Menu();coutsel;while(sel!=0)switch(sel)case 1: /打开文件coutfileName;flag = OpenFile(char *)fileName.c_str(),text);if(flag)PrintText(text);break;case 2: /新建文件if(flag)cout要保存前一个文件吗?(Y/N) ;int yon=YesOrNo();while(yon=-1)cout要保存前一个文件吗?(Y/N) ;yon=YesOrNo();if(yon=1)SaveFile(char *)fileName.c_str(),text);flag = false;clear(text);coutfileName;flag = CreateFile(char *)fileName.c_str(),text);if(flag)PrintText(text);break;case 3: /保存文件if(flag)SaveFile(char *)fileName.c_str(),text);flag = false;elsecoutfileName;flag = SaveFile(char *)fileName.c_str(),text);break;case 4: /插入字符串cout请选择要插入的位置(第x行第y个字符之后):endl;coutrow;coutcol;cout请输入要插入的字符串:;row-;col-;InsertStr(text,row,col);cout插入成功!endl;PrintText(text);break;case 5: /删除字符串int len;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论