@Perfect-Demo
2018-05-31T11:33:35.000000Z
字数 3398
阅读 849
——文件操作篇
大二下
(在打开.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{
//没有正在编辑的文件
//提示输入文档名字,注意这里不用输.txt
cout<<"请输入文档名字:";
//创建新文件
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',则进入保存文件模块。否则直接退出。如果没有在编辑区,则直接退出。