📄 filelibrary.cpp
字号:
#include"filelibrary.h"
#include<cstring>
#include<cstdlib>
#define Lenth_FileName 10 //文件名的长度
#define Lenth_TempData 1000 //临时数据内容的最大长度
#define Lenth_IsDelete 10 //删除标识的长度
FileFunction::FileFunction():NextNum(1){
}
void FileFunction::MenuProcess(){
system("cls");
while(1){
char* filename = new char[Lenth_FileName]; //必须被初始化
cout<<"****************************"<<endl;
cout<<"* *"<<endl;
cout<<"* 处 理 文 件 *"<<endl;
cout<<"* *"<<endl;
cout<<"****************************"<<endl;
cout<<"* 1.创建文件 *"<<endl;
cout<<"* 2.打开已有文件 *"<<endl;
cout<<"* 3.关闭文件 *"<<endl;
cout<<"* 0.返回主菜单 *"<<endl;
cout<<"* *"<<endl;
cout<<"****************************"<<endl;
cout<<"请输入选项的号码:";
int choice;
cin>>choice;
if(cin.fail()){
cout<<"输入错误!返回主菜单。"<<endl;
return;
}
switch(choice){
case 1:{
cout<<"请输入你要创建的文件名字:";
cin>>filename;
if(Create(filename))
cout<<"创建文件"<<filename<<"成功"<<endl;
else
cerr<<"创建文件"<<filename<<"失败"<<endl;
break;
}
case 2:{
cout<<"请输入你要打开的文件名字:";
cin>>filename;
if(Open(filename))
cerr <<"打开文件"<<filename<<"成功"<<endl;
else
cerr<<"打开文件"<<filename<<"失败"<<endl;
break;
}
case 3:{
if(Close())
cout<<"关闭文件成功"<<endl;
else
cout<<"没有文件被打开,关闭不成功"<<endl;
break;
}
case 0: return; //返回主菜单
default: cout << "输入错误,请再次输入"<<endl; break;
}
cout<<endl;
}
}
void FileFunction::MenuReadWrite(){
system("cls");
while(1){
cout<<"****************************"<<endl;
cout<<"* *"<<endl;
cout<<"* 顺 序 读 写 *"<<endl;
cout<<"* *"<<endl;
cout<<"****************************"<<endl;
cout<<"* 1.顺序读 *"<<endl;
cout<<"* 2.顺序写 *"<<endl;
cout<<"* 0.返回主菜单 *"<<endl;
cout<<"* *"<<endl;
cout<<"****************************"<<endl;
cout<<"请输入选项的号码:";
int choice;
cin>>choice;
if(cin.fail()){
cout<<"输入错误!返回主菜单。"<<endl;
return;
}
switch(choice){
case 1:{
if(!CheckFileOpen()){
cout<<"文件尚未打开,无法读取"<<endl;
break;
}
if(!ReadByOrder() )
cout<<"已经到达文件尾,读取记录未成功。"<<endl;
break;
}
case 2:{
WriteByOrder();
break;
}
case 0: return; //返回主菜单
default: cout << "输入错误,请再次输入"<<endl; break;
}
cout<<endl;
}
}
void FileFunction::MenuAddRec(){ //加入记录:加到尾部;插到指定的位置之前(按记录号或记录标识);插到当前记录之前;
system("cls");
while(1){
cout<<"***************************************"<<endl;
cout<<"* *"<<endl;
cout<<"* 添 加 记 录 *"<<endl;
cout<<"* *"<<endl;
cout<<"***************************************"<<endl;
cout<<"* *"<<endl;
cout<<"* 1.加到尾部 *"<<endl;
cout<<"* 2.按记录号插到指定的位置之前 *"<<endl;
cout<<"* 3.按记录标识插到指定的位置之前 *"<<endl;
cout<<"* 4.插到当前记录之前 *"<<endl;
cout<<"* 0.返回主菜单 *"<<endl;
cout<<"* *"<<endl;
cout<<"***************************************"<<endl;
cout<<"请输入选项的号码:";
int choice;
cin>>choice;
if(cin.fail()){
cout<<"输入错误!返回主菜单。"<<endl;
return;
}
switch(choice){
case 1:{
AppendRec();
break;
}
case 2:{
int seq;
cout<<"请输入记录的序号:";
cin>>seq;
if(LocateBySeq(seq)){
InsertCurrentRec();
}
else{
cout<<"不存在序号为"<<seq<<"的记录"<<endl;
}
break;
}
case 3:{
char* tag = new char[TagLenth+1];
cout<<"请输入记录的标识:";
cin>>tag;
if(LocateByTag(tag)){
InsertCurrentRec();
}
else{
cout<<"不存在以"<<tag<<"为标识的记录。"<<endl;
}
break;
}
case 4:{
InsertCurrentRec();
break;
}
case 0: return; //返回主菜单
default: cout << "输入错误,请再次输入"<<endl; break;
}
cout<<endl;
}
}
void FileFunction::MenuLocateRec(){
system("cls");
while(1){
cout<<"****************************"<<endl;
cout<<"* *"<<endl;
cout<<"* 定 位 记 录 *"<<endl;
cout<<"* *"<<endl;
cout<<"****************************"<<endl;
cout<<"* 1.按记录号定位记录 *"<<endl;
cout<<"* 2.按记录标识定位记录 *"<<endl;
cout<<"* 0.返回主菜单 *"<<endl;
cout<<"* *"<<endl;
cout<<"****************************"<<endl;
cout<<"请输入选项的号码:";
int choice;
cin>>choice;
if(cin.fail()){
cout<<"输入错误!返回主菜单。"<<endl;
return;
}
switch(choice){
case 1: {
int seq;
cout<<"请输入记录的序号:";
cin>>seq;
if(LocateBySeq(seq)){
Record *temp = &RecList.getValue();
//读取数据内容
File.seekg( temp->getOffset()+Lenth_RecSeq+TagLenth +1 +Lenth_Offset + Lenth_DataLenth ,ios::beg);
char* data = new char[ temp->getDataLenth()+1];
File.read(data, temp->getDataLenth()); //存的时候是以write来存,所遇取的时候对应用read
data[ temp->getDataLenth() ]='\0'; //设置最后一个字符为结束符号
cout<<"定位成功!"<<endl;
cout<<"当前记录的序号是"<< temp->getRecSeq()<<endl;
cout<<"标识:"<< temp->getRecTag()<<endl;
char* s = new char[10];
s = strncpy( s, data,9);
s[9]='\0';
if(strcmp(s,"filelink:")==0){
int t = temp->getDataLenth()-9;
char* newfilename = new char[t+1];
for(int i=0; i < t; i++ ){
newfilename[i] = data[9+i];
}
newfilename[t]='\0';
cout<<"此记录为文件"<<newfilename<<"的链接"<<endl;
system(newfilename);
}
else{
cout<<"数据内容:"<<endl<<data<<endl;
}
}
else{
cout<<"不存在序号为"<<seq<<"的记录"<<endl;
}
break;
}
case 2: {
char* tag = new char[TagLenth+1];
cout<<"请输入记录的标识:";
cin>>tag;
if(LocateByTag(tag)){
Record *temp = &RecList.getValue();
//读取数据内容
File.seekg( temp->getOffset()+Lenth_RecSeq+TagLenth +1 +Lenth_Offset + Lenth_DataLenth,ios::beg);
char* data = new char[ temp->getDataLenth()+1];
File.read(data, temp->getDataLenth()); //存的时候是以write来存,所遇取的时候对应用read
data[ temp->getDataLenth() ]='\0'; //设置最后一个字符为结束符号
cout<<"定位成功!"<<endl;
cout<<"当前记录的序号是"<< temp->getRecSeq()<<endl;
cout<<"标识:"<< temp->getRecTag()<<endl;
char* s = new char[10];
s = strncpy( s, data,9);
s[9]='\0';
if(strcmp(s,"filelink:")==0){
int t = temp->getDataLenth()-9;
char* newfilename = new char[t+1];
for(int i=0; i < t; i++ ){
newfilename[i] = data[9+i];
}
newfilename[t]='\0';
cout<<"此记录为文件"<<newfilename<<"的链接"<<endl;
system(newfilename);
}
else{
cout<<"数据内容:"<<endl<<data<<endl;
}
}
else{
cout<<"不存在以"<<tag<<"为标识的记录。"<<endl;
}
break;
}
case 0: return; //返回主菜单
default: cout << "输入错误,请再次输入"<<endl; break;
}
cout<<endl;
}
}
void FileFunction::MenuRewriteRec(){
system("cls");
while(1){
cout<<"**********************************"<<endl;
cout<<"* *"<<endl;
cout<<"* 重 写 记 录 *"<<endl;
cout<<"* *"<<endl;
cout<<"**********************************"<<endl;
cout<<"* 1.按记录号重写记录内容 *"<<endl;
cout<<"* 2.按记录标识重写记录内容 *"<<endl;
cout<<"* *"<<endl;
cout<<"* 3.按记录号重写记录标识 *"<<endl;
cout<<"* 4.按记录标识重写记录标识 *"<<endl;
cout<<"* *"<<endl;
cout<<"* 0.返回主菜单 *"<<endl;
cout<<"* *"<<endl;
cout<<"**********************************"<<endl;
cout<<"请输入选项的号码:";
int choice;
cin>>choice;
if(cin.fail()){
cout<<"输入错误!返回主菜单。"<<endl;
return;
}
switch(choice){
case 1: {
int seq;
cout<<"请输入要重写的记录的序号:";
cin>>seq;
getchar();
if(LocateBySeq(seq)){
if(RewriteData())
cout<<"重写记录成功!"<<endl;
else
cout<<"重写记录失败。"<<endl;
}
else{
cout<<"不存在序号为"<<seq<<"的记录"<<endl;
}
break;
}
case 2: {
char* tag = new char[TagLenth+1];
cout<<"请输入记录的标识:";
cin>>tag;
getchar();
if(LocateByTag(tag)){
if(RewriteData())
cout<<"重写记录成功!"<<endl;
else
cout<<"重写记录失败。"<<endl;
}
else{
cout<<"不存在以"<<tag<<"为标识的记录。"<<endl;
}
break;
}
case 3: {
int seq;
cout<<"请输入要重写的记录的序号:";
cin>>seq;
getchar();
if(LocateBySeq(seq)){
if(RewriteTag())
cout<<"重写记录标识成功!"<<endl;
else
cout<<"重写记录标识失败。"<<endl;
}
else{
cout<<"不存在序号为"<<seq<<"的记录"<<endl;
}
break;
}
case 4: {
char* tag = new char[TagLenth+1];
cout<<"请输入记录的标识:";
cin>>tag;
getchar();
if(LocateByTag(tag)){
if(RewriteTag())
cout<<"重写记录标识成功!"<<endl;
else
cout<<"重写记录标识失败。"<<endl;
}
else{
cout<<"不存在以"<<tag<<"为标识的记录。"<<endl;
}
break;
}
case 0: return; //返回主菜单
default: cout << "输入错误,请再次输入"<<endl; break;
}
cout<<endl;
}
}
void FileFunction::MenuDeleteRec(){//菜单6.删除记录
system("cls");
while(1){
cout<<"***************************************"<<endl;
cout<<"* *"<<endl;
cout<<"* 删 除 记 录 *"<<endl;
cout<<"* *"<<endl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -