利用c++ list类制作一个简单的文本编辑器

RT,这应该是一个很简单的问题,但是本人资质有限,还是想了一段时间,折腾一天写出来了,贴在这里自己留个记录随时更改。
</pre><pre name="code" class="cpp">#include <iostream>
#include <list>
#include <string>
#include <cstdlib>
#include <fstream>
#include <cmath>

using namespace std;

class Edit{
public:
	Edit();
	int Judge(string p); //判断是正常输入还是特殊操作
	void Insert_list(string); //用于插入文本的子函数
	void Edit_list(string);  //用于将读入的文本存储的子函数
	void Delete_list(int, int);  //进行删除操作的子函数
	void Save(); //保存操作
	void Judge_number(int, string);  //查看judge返回的数字以便进行相应操作
	void edit(); //编辑函数,用于读入一行字符串
	void Display();  //用于显示当前存储的文本
private:
	list<string> edit_list; //存储文本
	int count;//记录当前行数
	list<string>::iterator i1; //list指针用于指示需要进行操作的位置
	int insert = 0; //插入行数
	int delete_n = 0, delete_m = 0;//记录删除行数
};

Edit::Edit(){
	count = 0;
}

/*
Judge(string p) 对输入的内容进行判断,并返回一个整形对其进行分类;
0.读入输入的内容存储在list<string> edit_list中保存;
1.鉴别I 和 I number //number为需要插入的行数,只输入I时在当前位置插入,有数字时在数字相应的行数插入。
2.输入D,删除当前行
3.D n 删除第n行
4.D n m 删除第n行到第m行
5.L 列出当前保存的内容
6.E 将内容保存到test.txt并退出
*/
int Edit::Judge(string p){
	int len = p.size();

	//只检测到一个I时
	if (p[0] == 'I' && len == 1){
		return 1;
	}
	//检测到I加数字时,格式需要严格控制为I+空格+number
	if (p[0] == 'I' && len >= 3){
		int digit = 0;//记录读到的数字的位数,因为只能一个字符一个字符读入,因此需要鉴别数字个数
		int temp = 0;//临时变量,用于记录读入的数字

		for (int i = 2; i < len; i++){
			if (p[i] >= '0' && p[i] <= '9'){
				digit++;
			}
			else
				break;
		}
		//根据位数对temp赋值并在最后传递给insert
		for (int j = 0; j < digit; j++){

			temp += (p[j + 2] - 48) * (pow(10, digit - 1 - j));
		}
		insert = temp;
		return 1;
	}

	if (p[0] == 'D' && len == 1){
		return 2;
	}
	if (p[0] == 'D' && len >= 3){
		int digit_n = 0;//记录n的位数
		int digit_m = 0;//记录m的位数
		int temp_n = 0;//临时变量用于最后传递给delete_n
		int temp_m = 0;//临时变量用于最后传递给delete_m
		int i = 2;
		
		for (; i < len; i++){
			if (p[i] >= '0' && p[i] <= '9'){
				digit_n++;
			}
			else
				break;
		}
		
		//得出delete_n
		for (int j = 0; j < digit_n; j++){
			temp_n += (p[j + 2] - 48) * (pow(10, digit_n - 1 - j));
		}
		delete_n = temp_n;

		//判断是一个数字还是两个数字的输入
		if (i >= len){
			return 3;
		}
		
		else{
			for (i = i + 1; i < len; i++){
				if (p[i] >= '0' && p[i] <= '9'){
					digit_m++;
				}
				else
					break;
			}

			for (int j = 0; j < digit_m; j++){
				temp_m += (p[j + 2 + digit_n + 1] - 48)*(pow(10, digit_m - 1 - j));
			}
			delete_m = temp_m;

			return 4;
		}
	
	}

	//判断是否为‘L’
	if (p[0] == 'L' && len == 1){
		return 5;
	} 

	//判断是否为‘E’
	if (p[0] == 'E' && len == 1){
		return 6;
	}

	//以上都不是返回0开始输入内容
	return 0;

}

//进行输入读取的子函数
void Edit::edit() {
	count++;
	string p;
	cout << count << ">";
	getline(cin, p);
	int numforjudege = Judge(p);
	Judge_number(numforjudege, p);
}

void Edit::Judge_number(int num, string str){
		
	switch (num){
		case 0:
			Edit_list(str);
		case 1:
			Insert_list(str);
		case 2:
			Delete_list(0, 0);
		case 3:
			Delete_list(delete_n, 0);
		case 4:
			Delete_list(delete_n, delete_m);
		case 5:
			Display();
		case 6:
			Save();
			break;
	}

	exit(1);
	
}

void Edit::Edit_list(string str){
	list<string>::iterator i2 = edit_list.begin();
	//这里for循环是为了寻找count目前所在的行相对应的list指针,因为使用 i2 + count - 1 这样的指针会报错,所以选择用这个方法来定位
	for (int i = 0; i < count - 1; i++){
		i2++;
	}
	i1 = i2;
	edit_list.insert(i1, 1, str);//list自带的插入函数
	edit();//存储完后进入下一次输入
}

void Edit::Insert_list( string str){
	if (str.size() == 1){
		count = count - 1;
		edit();
	}
	else{
		int num = insert;
		count = num - 1;
		edit();
	}

}

void Edit::Delete_list(int n, int m){
	if (n == 0 && m == 0){
		list<string>::iterator i2 = edit_list.end();
		i2--;
		i2 = edit_list.erase(i2);
		count = count - 2;
		edit();
	}
	else if (m == 0){
		list<string>::iterator i3 = edit_list.begin();
		for (int i = 0; i < n - 1; i++){
			i3++;
		}
		i3 = edit_list.erase(i3);
		if (count >= n){
			count = count - 2;
		}
		else{
			count = count - 1;
		}	
		edit();
	}
	else{
		list<string>::iterator i4 = edit_list.begin();
		list<string>::iterator i5;
		if (n > m){
			int temp = n;
			n = m;
			m = temp;
		}	
		for (int i = 0; i < n - 1; i++){
				i4++;
		}
		i5 = i4;
		for (int j = 0; j <= m - n; j++){
				i5++;
		}

		i4 = edit_list.erase(i4, i5);

		if (count >= m){
			count = count - (m - n + 2);
		}
		else if (count >= n){
			count = count - (count - n + 2);
		}
		else{
			count = count - 1;
		}
		edit();

	}
}

void Edit::Display(){
	size_t num = edit_list.size();

	list<string>::iterator iter = edit_list.begin();

	for (int i = 0; i < num; i++){
		cout << i + 1 << ">";
		cout << *iter << endl;
		iter++;
	}

	count--;

	edit();
}

void Edit::Save(){
	ofstream fout("test.txt");
	
	list<string>::iterator ptr = edit_list.begin();
	int size = edit_list.size();
	for (int i = 0; i < size; i++){
		fout << i + 1 << ">" << (*ptr) << "\n";
		ptr++;
	}
}

int main(){

	Edit myedit;

	myedit.edit();

	return 0;
}

RT,这应该是一个很简单的问题,但是本人资质有限,还是想了一段时间,折腾一天写出来了,贴在这里自己留个记录随时更改。

RT,这应该是一个很简单的问题,但是本人资质有限,还是想了一段时间,折腾一天写出来了,贴在这里自己留个记录随时更改。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值