📄 filelibrary.cpp
字号:
return true;
}
return false;
}
bool FileFunction::RewriteData(){
char* tempdata = new char[Lenth_TempData];
int datalenth;
cout<<"记录内容为:"<<endl;
cout<<"1.字节流嵌入"<<endl;
cout<<"2.文件链接"<<endl;
cout<<"请输入选项的号码:"<<endl;
int choice;
cin>>choice;
getchar();
if(cin.fail()){
cout<<"输入错误!返回上一级菜单。"<<endl;
return false;
}
if(choice == 1){
cout<<"请输入记录内容,以ctrl+Z,回车,再Ctrl+z结束"<<endl;
cin.read(tempdata,Lenth_TempData);
File.width(Lenth_DataLenth);
datalenth = cin.gcount();
cin.clear(); //读入数据后,ios::eof被设置,还原状态
}
else if (choice == 2){
cout<<"请输入文件链接地址,按回车结束"<<endl;
char* link = new char[Lenth_TempData];
cin.get(link,Lenth_TempData);
File.width(Lenth_DataLenth);
datalenth = cin.gcount()+ 9; //数据内容的开始为"文件链接:",所以数据长度要加上9
getchar(); //跳过缓冲中的回车
tempdata = strcpy(tempdata,"filelink:");
tempdata = strcat(tempdata,link);
cin.clear(); //读入数据后,ios::eof被设置,还原状态
}
else
{
cout<<"输入错误!返回上一级菜单。"<<endl;
}
cin.clear(); //读入数据后,ios::eof被设置,还原状态
Record* current;
current = &RecList.getValue();
if(datalenth <= current->getDataLenth() ){ //直接在原来位置上覆盖原数据
current->setDataLenth(datalenth);
File.seekg(current->getOffset()+Lenth_RecSeq+TagLenth +1 +Lenth_Offset, ios::beg);
File.width(Lenth_DataLenth);
File<<datalenth;
// cout<<"datalenth:"<<File.tellg()<<endl;
File.write(tempdata,datalenth);
}
else{ //在原数据上加上删除标记,在文件最后加上新数据
bool isdelete = true;
File.seekg(current->getOffset()+Lenth_RecSeq+TagLenth, ios::beg);
File<<isdelete;
current->setDataLenth(datalenth);
current->setOffset(End);
isdelete = false;
File.seekg(End,ios::beg); //定位要插入的位置
File.width(Lenth_RecSeq); //设置输出的宽度为MaxTagLenth
File.flags(ios::left); //设置为左对齐
File<<current->getRecSeq();
File.fill('\0'); //设置为结束符,以便进行字符串比较
File.width(TagLenth);
File<<current->getRecTag();
File.fill(' '); //还原为空白符
File<<isdelete;
File.width(Lenth_Offset);
File<<End;
File.width(Lenth_DataLenth);
File<<datalenth<<endl;
File.write(tempdata,datalenth);
End = File.tellg(); //文件的结束位置后移
}
return true;
}
bool FileFunction::RewriteTag(){
char* rectag = new char[TagLenth];
cout<<"请输入新标识(长度小于10,无空格符),以回车结束"<<endl;
cin>>rectag;
getchar(); //忽略输入缓冲的回车符
Record* temp;
//顺序读取链表到尾部,判断文件标识表示是否重复
Record *current = &RecList.getValue();
for( RecList.setStart(); RecList.rightLenth()>0; RecList.next()){
temp = &RecList.getValue();
if( strcmp( temp->getRecTag(), rectag) == 0){
cout<<"记录标识\""<<rectag<<"\"与现有记录重复。修改记录标识不成功"<<endl;
return false;
}
}
//还原指针
for( RecList.setStart(); RecList.rightLenth()>0; RecList.next()){
temp = &RecList.getValue();
if( current->getRecSeq() == temp->getRecSeq() )
break;
}
File.seekg(current->getOffset()+Lenth_RecSeq, ios::beg);
File.fill('\0'); //设置为结束符,以便进行字符串比较
File.width(TagLenth);
File.flags(ios::left); //设置为左对齐
File<<rectag;
current->setRecTag(rectag);
return true;
}
int FileFunction::CountRec(){//求文件记录数
return RecList.leftLenth() +RecList.rightLenth();
}
long FileFunction::CountByte(){//求文件字节数
File.seekg(0, ios::end);
return File.tellg();
}
bool FileFunction::WriteAllToFile(){
//先判断文件是否打开
if(!CheckFileOpen()){
cout<<"文件尚未打开,无法写为新文件"<<endl;
return false;
}
File.clear();
ofstream newfile;
char* filename = new char[Lenth_FileName];
cout<<"请输入你要写入的新文件的名字:";
cin>>filename;
newfile.open(filename, ios::out | ios::binary); //创建一个空文件,并处于写状态。
ofstream indexfile; //同步创建索引文件
char* index = new char[20];
index = strcpy(index,filename);
index = strcat(index,"index.txt"); //索引文件为 filenameindex.txt
indexfile.open(index);
indexfile.width(Lenth_RecSeq); //设置输出的宽度为MaxTagLenth
indexfile.flags(ios::left); //设置为左对齐
indexfile<<"记录号";
indexfile.width(TagLenth);
indexfile<<"记录标识";
indexfile.width(Lenth_IsDelete);
indexfile<<"删除标志";
indexfile.width(Lenth_Offset);
indexfile<<"偏移位置";
indexfile.width(Lenth_DataLenth);
indexfile<<"数据长度"<<endl;
Record* temp;
for(RecList.setStart(); RecList.rightLenth()>0; RecList.next()){
int newoffset; //记录在新文件中有不一样的偏移位置
newoffset = newfile.tellp();
temp = &RecList.getValue();
newfile.width(Lenth_RecSeq); //设置输出的宽度为MaxTagLenth
newfile.flags(ios::left); //设置为左对齐
newfile<<temp->getRecSeq();
newfile.fill('\0'); //设置为结束符,以便进行字符串比较
newfile.width(TagLenth);
newfile<<temp->getRecTag();;
newfile.fill(' '); //还原为空白符
newfile<<temp->CheckIsDelete();
newfile.width(Lenth_Offset);
newfile<<newoffset;
newfile.width(Lenth_DataLenth);
newfile<<temp->getDataLenth();
File.seekg( temp->getOffset()+Lenth_RecSeq+TagLenth +1 +Lenth_Offset + Lenth_DataLenth,ios::beg);
char* data = new char[ temp->getDataLenth()];
File.read(data, temp->getDataLenth()); //存的时候是以write来存,所以取的时候对应用read
newfile.write(data,temp->getDataLenth());
indexfile.width(Lenth_RecSeq); //设置输出的宽度为MaxTagLenth
indexfile.flags(ios::left); //设置为左对齐
indexfile<<temp->getRecSeq();
indexfile.fill('\0'); //设置为结束符,以便进行字符串比较
indexfile.width(TagLenth);
indexfile<<temp->getRecTag();;
indexfile.fill(' '); //还原为空白符
indexfile.width(Lenth_IsDelete);
indexfile<<temp->CheckIsDelete();
indexfile.width(Lenth_Offset);
indexfile<<newoffset;
indexfile.width(Lenth_DataLenth);
indexfile<<temp->getDataLenth()<<endl;
}
indexfile.close();
cout<<"写进新文件"<<filename<<"成功"<<endl;
return true;
}
bool FileFunction::WriteSomeToFile(){
//先判断文件是否打开
if(!CheckFileOpen()){
cout<<"文件尚未打开,无法写为新文件"<<endl;
return false;
}
File.clear();
ofstream newfile;
char* filename = new char[Lenth_FileName];
cout<<"请输入你要写入的新文件的名字:";
cin>>filename;
newfile.open(filename, ios::out | ios::binary); //创建一个空文件,并处于写状态。
ofstream indexfile; //同步创建索引文件
char* index = new char[20];
index = strcpy(index,filename);
index = strcat(index,"index.txt"); //索引文件为 filenameindex.txt
indexfile.open(index);
indexfile.width(Lenth_RecSeq); //设置输出的宽度为MaxTagLenth
indexfile.flags(ios::left); //设置为左对齐
indexfile<<"记录号";
indexfile.width(TagLenth);
indexfile<<"记录标识";
indexfile.width(Lenth_IsDelete);
indexfile<<"删除标志";
indexfile.width(Lenth_Offset);
indexfile<<"偏移位置";
indexfile.width(Lenth_DataLenth);
indexfile<<"数据长度"<<endl;
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;
break;
}
if(choice == 1){
int seq;
cout<<"请输入记录的序号:";
cin>>seq;
if(LocateBySeq(seq)){
Record *temp = &RecList.getValue();
int newoffset; //记录在新文件中有不一样的偏移位置
newoffset = newfile.tellp();
newfile.width(Lenth_RecSeq); //设置输出的宽度为MaxTagLenth
newfile.flags(ios::left); //设置为左对齐
newfile<<temp->getRecSeq();
newfile.fill('\0'); //设置为结束符,以便进行字符串比较
newfile.width(TagLenth);
newfile<<temp->getRecTag();;
newfile.fill(' '); //还原为空白符
newfile<<temp->CheckIsDelete();
newfile.width(Lenth_Offset);
newfile<<newoffset;
newfile.width(Lenth_DataLenth);
newfile<<temp->getDataLenth();
File.seekg( temp->getOffset()+Lenth_RecSeq+TagLenth +1 +Lenth_Offset + Lenth_DataLenth,ios::beg);
char* data = new char[ temp->getDataLenth()];
File.read(data, temp->getDataLenth()); //存的时候是以write来存,所以取的时候对应用read
newfile.write(data,temp->getDataLenth());
indexfile.width(Lenth_RecSeq); //设置输出的宽度为MaxTagLenth
indexfile.flags(ios::left); //设置为左对齐
indexfile<<temp->getRecSeq();
indexfile.fill('\0'); //设置为结束符,以便进行字符串比较
indexfile.width(TagLenth);
indexfile<<temp->getRecTag();;
indexfile.fill(' '); //还原为空白符
indexfile.width(Lenth_IsDelete);
indexfile<<temp->CheckIsDelete();
indexfile.width(Lenth_Offset);
indexfile<<newoffset;
indexfile.width(Lenth_DataLenth);
indexfile<<temp->getDataLenth()<<endl;
}
else{
cout<<"不存在序号为"<<seq<<"的记录"<<endl;
}
}
else if( choice == 2){
char* tag = new char[TagLenth+1];
cout<<"请输入记录的标识:";
cin>>tag;
if(LocateByTag(tag)){
Record *temp = &RecList.getValue();
int newoffset; //记录在新文件中有不一样的偏移位置
newoffset = newfile.tellp();
newfile.width(Lenth_RecSeq); //设置输出的宽度为MaxTagLenth
newfile.flags(ios::left); //设置为左对齐
newfile<<temp->getRecSeq();
newfile.fill('\0'); //设置为结束符,以便进行字符串比较
newfile.width(TagLenth);
newfile<<temp->getRecTag();;
newfile.fill(' '); //还原为空白符
newfile<<temp->CheckIsDelete();
newfile.width(Lenth_Offset);
newfile<<newoffset;
newfile.width(Lenth_DataLenth);
newfile<<temp->getDataLenth();
File.seekg( temp->getOffset()+Lenth_RecSeq+TagLenth +1 +Lenth_Offset + Lenth_DataLenth,ios::beg);
char* data = new char[ temp->getDataLenth()];
File.read(data, temp->getDataLenth()); //存的时候是以write来存,所以取的时候对应用read
newfile.write(data,temp->getDataLenth());
indexfile.width(Lenth_RecSeq); //设置输出的宽度为MaxTagLenth
indexfile.flags(ios::left); //设置为左对齐
indexfile<<temp->getRecSeq();
indexfile.fill('\0'); //设置为结束符,以便进行字符串比较
indexfile.width(TagLenth);
indexfile<<temp->getRecTag();;
indexfile.fill(' '); //还原为空白符
indexfile.width(Lenth_IsDelete);
indexfile<<temp->CheckIsDelete();
indexfile.width(Lenth_Offset);
indexfile<<newoffset;
indexfile.width(Lenth_DataLenth);
indexfile<<temp->getDataLenth()<<endl;
}
else{
cout<<"不存在以"<<tag<<"为标识的记录。"<<endl;
}
}
else if( choice == 0)
break;
else{
cout << "输入错误,请再次输入"<<endl;
continue;
}
}
indexfile.close();
cout<<"写进新文件"<<filename<<"成功"<<endl;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -