[关闭]
@Perfect-Demo 2018-05-31T11:33:35.000000Z 字数 3398 阅读 849

MiniWord程序详细设计报告(3)

——文件操作篇

大二下


操作流程:

(在打开.exe文件后)
(注意:该miniword编辑器采用仿照linux的vim编辑器的输入模式,在想要输入时,需要先按下'i' 。)

1. 命令选择状态的命令集:

  1. r 读取命令
  2. s 保存命令
  3. n 新建命令
  4. i 编辑命令
  5. f 查找命令
  6. b 块操作命令
  7. q 退出命令
  8. esc 退出当前状态,进入命令选择状态命令

2. 读取文件:

输入'r'命令,会出现提示输入文件名打开文件,并且在编辑区显示出来。
如果输入的文件名存在则会直接进入编辑区。否则,提示文件不存在已创建一个新的文件,然后自动跳转到编辑区,此时该文件为一个空文件。

  1. void get_filename(void){
  2. //运行析构函数,为了让能够重复读取文件
  3. miniword.~Structure() ;
  4. //提示输入文件名
  5. cout << "请输入文件名" << endl;
  6. //打开文件
  7. fstream file(filename);
  8. //判断文件是否存在
  9. if(file){
  10. //调用函数读取文件到内存然后输出
  11. miniword.ReadInAnEssay(file, coord);
  12. miniword.Print(coord);
  13. }
  14. else{
  15. //创建新的文件
  16. ofstream outFile(miniword.name.c_str());
  17. //提示文件不存在,已经创建新的文件
  18. cout << "该文件不存在,已为您创建新文件。(即将跳转)" << endl;
  19. miniword.ReadInAnEssay(file, coord);
  20. miniword.Print(coord);
  21. }
  22. }

3. 新建文件:

输'n'命令,如果没有在编辑区,则会提示输入需要创建的文件名(这里输入文件名不需要输入.txt后缀)。如果此时在编辑区,则会提示是否保存该文件,如果输入'n'则放弃保存,直接新建文件。如果输入'y'则会进入保存文件模块。

  1. void create_file(void){
  2. //判断现在是否有正在编辑的文件
  3. if (miniword.name.length() != 0){
  4. //如果有提示是否保存,输入y或n来作为应答
  5. cin >> flag33;
  6. if(flag33=='y'){
  7. //保存文件
  8. save_file();
  9. }
  10. else ;//无动作
  11. }
  12. else{
  13. //没有正在编辑的文件
  14. //提示输入文档名字,注意这里不用输.txt
  15. cout<<"请输入文档名字:";
  16. //创建新文件
  17. ofstream outFile(miniword.name.c_str());
  18. //关闭创建的文件
  19. outFile.close();
  20. //打开该文件并读取到内存,然后输出
  21. fstream file(miniword.name.c_str());
  22. miniword.ReadInAnEssay(file, coord);
  23. miniword.Print(coord);
  24. //关闭文件
  25. file.close();
  26. }
  27. }

4. 保存文件:

输入's'命令。此时会跳转到保存文件界面,会提示是否更改文件名,输入'y'或者'n'进行选择,如果更改,则会提示输入新的文件名(这里输入文件名时不需要输入.txt后缀)。不更改则直接保存文件。最后都会跳转到提示保存成功界面然后自动跳转回编辑区。

  1. void save_file(void){
  2. //先清屏然后提示输入
  3. cout << "该文件名为 " << ss << " 是否修改?" << endl;
  4. 输入y或者n来作为命令回应
  5. if(是'y'){
  6. 提示输入
  7. ofstream outFile(miniword.name.c_str()); //输入后创建一个该名字的新文件
  8. }
  9. else if(是'n'){;}
  10. ofstream outFile(ss.c_str()); //打开文件
  11. int wide;//记录某行实时宽度
  12. Core *temp = miniword.head; //先确定整个结构体首部
  13. //定义指向块指针
  14. DataPart *t;
  15. while(temp){
  16. t = temp->FirstPar;//每次先指向头
  17. while(t){
  18. if (j小于该块字符串个数) {outFile<<t->data[j];i++; j++;}
  19. else{t = t->nextpart;j = 0;//指向下一行}
  20. }
  21. if(temp指向下一行不为空){
  22. coutFile<<'\n' ;//给文件加入换行
  23. }
  24. temp->nextcore; //指向下一行
  25. }
  26. 清屏,然后提示保存成功
  27. miniword.Print(coord); //接着跳转,继续输出内存内容
  28. }

5. 查找字符串:

在编辑区进入命令选择状态时,输入'f' (find)进入查找模块。自动跳转提示输入界面,输入需要查找的字符,然后回车。会进入编辑区,并且光标会在需要查找的字符下方。此时可以按下'm'来查看下一条符合查找条件的字段,也可以按下'y'进入功能选择界面。在这个界面你可以根据提示按下'd'回车,删掉该块字符,然后会自动跳转到编辑区。也可以按下'c'回车来进入替换界面,根据提示输入想要替换的字符串,然后回车,会自动跳转到编辑区,并且替换该字符串。

  1. void FindText(void){
  2. 给初始内存光标位置与屏幕光标位置定位; 输入想要查找的字符,自动获取字符长度;
  3. while(没有到达最后的文章结尾){
  4. Mark结构体记录现在内存光标位置;
  5. while(没有到达该段结尾) character = 提取光标后面的该段所有字符 ;
  6. if(该段字符长度小于需要查找的字符串的长度){则直接转换到下一段并且光标置与段首开始,然后结束该次循环;}
  7. //下面开始匹配操作
  8. while(还没有完全匹配&&还没到结尾){
  9. if(字符相同){character下标++ 需要查找的字符串下标++ ;}
  10. else{character下标 = 当前下标-需要查找的字符串下标+1 ;需要查找的字符串下标=0;}
  11. }
  12. if(找到){
  13. 用一个Mark结构体记录查找前光标位置;
  14. 计算光标的屏幕所在行与列;
  15. miniword.Point指向这个位置;
  16. //进入流程选择
  17. switch(order) {
  18. case 按下m :break ; //直接进入下一条操作
  19. case esc ://退出到命令选择模块
  20. return ; break ;
  21. case y ://进入已查找功能选择模块
  22. 提示输入功能命令,d删除,c替换;
  23. if(d){删除查找到的该字段;}
  24. else{提示输入需要替换的字段;替换该字段;} break ;}
  25. //接下来进行查找下一条的准备
  26. if(目前光标没有在段尾){内存内光标直接向后一格。;}
  27. else{光标定位到下一段段首;}
  28. }
  29. else{//该段处没有找到
  30. 光标去往下一段;if(下一段不为空){光标置于段首}
  31. else{内存与屏幕光标均回到上一次初始位子}
  32. }}}

6. 块操作:

在编辑区进入命令选择状态时,输入'b' (batch),进入块操作模式。移动光标到想要到达的地方。然后可以按下'c',进行拷贝操作,按下'd'进行该块的删除,按下'v'进行该块的粘贴。(要注意的是,这个块的拷贝与粘贴是保留了选择块的结构的(比如两段文字复制粘贴后还是两段),并且当你复制之后,你可以进入编辑模式,在你想要粘贴的地方进入块操作模式然后进行粘贴)。

  1. void Batch(void){
  2. 记录下当前内存与屏幕中光标位置;
  3. while(1){
  4. 调用ch = gotoxy(coord)函数;
  5. 用另一个Mark结构体记录移动后的内存光标位置;用COORD结构体记录屏幕光标位置;
  6. if(ch == esc){//跳出函数,进入命令选择模块
  7. break ;}
  8. else if(按下c){//拷贝你块选择的字符串
  9. 置空保存的缓冲区;
  10. while(指向的块开始位置的结构体 != 快结束位置的结构体){
  11. 将所有字符写入缓冲区 ;
  12. }
  13. else if(ch == d){//进行块删除功能操作
  14. while(屏幕光标位置不在初始光标位置){delete1(coord) ;输出文字;设定光标位置;}}
  15. else if(ch == v){//粘贴操作
  16. for(i=0;i<len_buffer;i++){
  17. if(buffer_copy[i]=='\n'){//进行换行操作
  18. insterline(coord) ;}
  19. else{edit(buffer_copy[i],coord);}}}}}}

7. 退出系统:

输入'q' 如果在编辑区有改动,则提示是否需要保存文件再退出。输入'y'与'n'进行选择。如果为'y',则进入保存文件模块。否则直接退出。如果没有在编辑区,则直接退出。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注