简单文本编辑器(C++)
一、功能要求
1、具有图形菜单界面;
2、查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除
3、可正确存盘、取盘;
4、正确显示总行数。
二、主程序流程图
三、数据结构
程序中用链表来保存文本,每一行为一个单向链表,每一行的表头保存在一个行链表中,形成了一个2维链表,结构如下图所示:
四、功能实现
打开文件
提示用户输入文件路径
判断文件路径是否有效,若无效,则提示错误信息并返回,否则继续执行。
若文件成功打开并且文件指针没有到文件尾,则从文件中一次读取一个字符,并将该字符添加到一列单链表节点中,直至遇到换行符(ASCII码10)。当列单链表形成后,它的首地址将被保存至行单链表的相应节点的数据域中,如此动作,直至文件指针指向文件尾部而结束。
新建文件
若行链表中有数据存在,则提示用户保存文件。
提示用户输入新建文件的保存路径。
测试新文件路径是否有效。
保存文件
打开文件。
遍历行单链表,遍历行单链表节点指向的列单链表,并将数据输出到文件,每个列单链表遍历完后,输出换行符到文件。
关闭文件
插入字符串
提示用户输入要插入字符串的位置(行号row,列号col)以及要插入的字符串。
先在行单链表中找到该行(第row行),若超出现有行数,则添加空行补齐;
将字符串插入该行(第row行)节点指向的列链表中的col-1位置,若超出现有节点数,则添加保存字符为空格的节点
补齐。
删除字符串
提示用户输入要删除字符串的开始位置(行号row,列号col)以及要插入的字符串的长度len。
在链表中定位到该行节点,若不存在,则提示无法删除并返回;否则继续执行。
在该行中定位到该col字符节点node,若不存在,则提示无法删除并返回;否则继续执行。
删除从node字符节点开始的len个节点。若不满len个,则全部删除。
查找替换
提示用户输入要查找的字符串。
遍历链表,找到每一个出现此字符串的位置并输出。
询问用户是否要进行替换。若选是,则提示用户输入要替换后的字符串,然后先在链表中删除原字符串,再在该位置插入要替换为的字符串。
行移动
提示用户输入要移动的行row和移动后的位置pos。
将行链表中的row-1节点移动到pos-1位置。
列移动
提示用户输入要移动的列col和移动后的位置pos。
遍历每一行(列链表),将每一行的col-1节点移动到pos位置处;若col-1节点不存在则不处理。
显示文本
遍历行、列链表,并将数据输出到控制台;
五、代码实现
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//author: yyc
//1、具有图形菜单界面;
//2、查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除
//3、可正确存盘、取盘;
//4、正确显示总行数。
//字符节点
struct Node
{
char ch;
Node* next;
};
//行节点
struct Row
{
Node* 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&&i<index)
{
p=p->next;
i++;
}
return p;
}
Row* locate(Row* list,int index)
{
Row* p=list;
int i=-1;
while(p!=NULL&&i<index)
{
p=p->next;
i++;
}
return p;
}
//插入节点
bool insert(Node* list,int index,char c)
{
Node* p= locate(list,index-1);
简单文本编辑器 来自淘豆网www.taodocs.com转载请标明出处.