@Perfect-Demo
2018-05-31T11:33:35.000000Z
字数 3398
阅读 995
——文件操作篇
大二下
(在打开.exe文件后)
(注意:该miniword编辑器采用仿照linux的vim编辑器的输入模式,在想要输入时,需要先按下'i' 。)
输入'r'命令,会出现提示输入文件名打开文件,并且在编辑区显示出来。
如果输入的文件名存在则会直接进入编辑区。否则,提示文件不存在已创建一个新的文件,然后自动跳转到编辑区,此时该文件为一个空文件。
void get_filename(void){//运行析构函数,为了让能够重复读取文件miniword.~Structure() ;//提示输入文件名cout << "请输入文件名" << endl;//打开文件fstream file(filename);//判断文件是否存在if(file){//调用函数读取文件到内存然后输出miniword.ReadInAnEssay(file, coord);miniword.Print(coord);}else{//创建新的文件ofstream outFile(miniword.name.c_str());//提示文件不存在,已经创建新的文件cout << "该文件不存在,已为您创建新文件。(即将跳转)" << endl;miniword.ReadInAnEssay(file, coord);miniword.Print(coord);}}
输'n'命令,如果没有在编辑区,则会提示输入需要创建的文件名(这里输入文件名不需要输入.txt后缀)。如果此时在编辑区,则会提示是否保存该文件,如果输入'n'则放弃保存,直接新建文件。如果输入'y'则会进入保存文件模块。
void create_file(void){//判断现在是否有正在编辑的文件if (miniword.name.length() != 0){//如果有提示是否保存,输入y或n来作为应答cin >> flag33;if(flag33=='y'){//保存文件save_file();}else ;//无动作}else{//没有正在编辑的文件//提示输入文档名字,注意这里不用输.txtcout<<"请输入文档名字:";//创建新文件ofstream outFile(miniword.name.c_str());//关闭创建的文件outFile.close();//打开该文件并读取到内存,然后输出fstream file(miniword.name.c_str());miniword.ReadInAnEssay(file, coord);miniword.Print(coord);//关闭文件file.close();}}
输入's'命令。此时会跳转到保存文件界面,会提示是否更改文件名,输入'y'或者'n'进行选择,如果更改,则会提示输入新的文件名(这里输入文件名时不需要输入.txt后缀)。不更改则直接保存文件。最后都会跳转到提示保存成功界面然后自动跳转回编辑区。
void save_file(void){//先清屏然后提示输入cout << "该文件名为 " << ss << " 是否修改?" << endl;输入y或者n来作为命令回应if(是'y'){提示输入ofstream outFile(miniword.name.c_str()); //输入后创建一个该名字的新文件}else if(是'n'){;}ofstream outFile(ss.c_str()); //打开文件int wide;//记录某行实时宽度Core *temp = miniword.head; //先确定整个结构体首部//定义指向块指针DataPart *t;while(temp){t = temp->FirstPar;//每次先指向头while(t){if (j小于该块字符串个数) {outFile<<t->data[j];i++; j++;}else{t = t->nextpart;j = 0;//指向下一行}}if(temp指向下一行不为空){coutFile<<'\n' ;//给文件加入换行}temp->nextcore; //指向下一行}清屏,然后提示保存成功miniword.Print(coord); //接着跳转,继续输出内存内容}
在编辑区进入命令选择状态时,输入'f' (find)进入查找模块。自动跳转提示输入界面,输入需要查找的字符,然后回车。会进入编辑区,并且光标会在需要查找的字符下方。此时可以按下'm'来查看下一条符合查找条件的字段,也可以按下'y'进入功能选择界面。在这个界面你可以根据提示按下'd'回车,删掉该块字符,然后会自动跳转到编辑区。也可以按下'c'回车来进入替换界面,根据提示输入想要替换的字符串,然后回车,会自动跳转到编辑区,并且替换该字符串。
void FindText(void){给初始内存光标位置与屏幕光标位置定位; 输入想要查找的字符,自动获取字符长度;while(没有到达最后的文章结尾){Mark结构体记录现在内存光标位置;while(没有到达该段结尾) character = 提取光标后面的该段所有字符 ;if(该段字符长度小于需要查找的字符串的长度){则直接转换到下一段并且光标置与段首开始,然后结束该次循环;}//下面开始匹配操作while(还没有完全匹配&&还没到结尾){if(字符相同){character下标++ 需要查找的字符串下标++ ;}else{character下标 = 当前下标-需要查找的字符串下标+1 ;需要查找的字符串下标=0;}}if(找到){用一个Mark结构体记录查找前光标位置;计算光标的屏幕所在行与列;将miniword.Point指向这个位置;//进入流程选择switch(order) {case 按下m :break ; //直接进入下一条操作case esc ://退出到命令选择模块return ; break ;case y ://进入已查找功能选择模块提示输入功能命令,d删除,c替换;if(d){删除查找到的该字段;}else{提示输入需要替换的字段;替换该字段;} break ;}//接下来进行查找下一条的准备if(目前光标没有在段尾){内存内光标直接向后一格。;}else{光标定位到下一段段首;}}else{//该段处没有找到光标去往下一段;if(下一段不为空){光标置于段首}else{内存与屏幕光标均回到上一次初始位子}}}}
在编辑区进入命令选择状态时,输入'b' (batch),进入块操作模式。移动光标到想要到达的地方。然后可以按下'c',进行拷贝操作,按下'd'进行该块的删除,按下'v'进行该块的粘贴。(要注意的是,这个块的拷贝与粘贴是保留了选择块的结构的(比如两段文字复制粘贴后还是两段),并且当你复制之后,你可以进入编辑模式,在你想要粘贴的地方进入块操作模式然后进行粘贴)。
void Batch(void){记录下当前内存与屏幕中光标位置;while(1){调用ch = gotoxy(coord)函数;用另一个Mark结构体记录移动后的内存光标位置;用COORD结构体记录屏幕光标位置;if(ch == esc){//跳出函数,进入命令选择模块break ;}else if(按下c){//拷贝你块选择的字符串置空保存的缓冲区;while(指向的块开始位置的结构体 != 快结束位置的结构体){将所有字符写入缓冲区 ;}else if(ch == d){//进行块删除功能操作while(屏幕光标位置不在初始光标位置){delete1(coord) ;输出文字;设定光标位置;}}else if(ch == v){//粘贴操作for(i=0;i<len_buffer;i++){if(buffer_copy[i]=='\n'){//进行换行操作insterline(coord) ;}else{edit(buffer_copy[i],coord);}}}}}}
输入'q' 如果在编辑区有改动,则提示是否需要保存文件再退出。输入'y'与'n'进行选择。如果为'y',则进入保存文件模块。否则直接退出。如果没有在编辑区,则直接退出。