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