📄 dzy.cpp
字号:
cout<<"| 4.修改记录标识 |"<<endl;
cout<<"| 5.重写一条记录 |"<<endl;
cout<<"| 6.写为新文件 |"<<endl;
cout<<"| 7.计数并列出记录列表 |"<<endl;
cout<<"| 8.浏览记录文件内容 |"<<endl;
cout<<"| 0.关闭当前文件 |"<<endl;
cout<<"| * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |"<<endl;
cin>>choice;
switch(choice)
{
case '1':AddRecord(f,fileName); break;
case '2':DeleteRecord(f); break;
case '3':LocateRecord(f); break;
case '4':ModifyRecordTag(f); break;
case '5':RewriteRecord(f,fileName); break;
case '6':ProduceNewFile(f); break;
case '7':CountNum(f); break;
case '8':Browse(f); break;
case '0':
cout<<"你确实想关闭此文件吗?(Y/N)"<<endl;
char c;
cin>>c;
if(c=='y'||c=='Y') return;
else break;
default:cout<<"输入选项错误,请重新输入!\n\n";
}
}
}
/**************************************************************/
void AddRecord(fstream & f,char * fileName) //加入记录
{
int n; //记录号
char ch,choice,
k[KEYLENGTH];//记录标识
RecordFile RF; //声明对象
long RFLength; //对象RF的长度
long posCur; //记录当前位置信息
long posEnd; //记录末尾位置信息
long track; //用于跟踪指针位置
fstream temp; //创建一个临时文件,用于存放当前指针后面的数据
while(1)
{
cout<<"| * * * * * * * * * * * * *加入记录* * * * * * * * * * * * * |"<<endl;
cout<<"| 请键入操作选择: |"<<endl;
cout<<"| 1.加入到尾部 |"<<endl;
cout<<"| 2.插到指定位置之前 |"<<endl;
cout<<"| 3.插入到当前记录之前 |"<<endl;
cout<<"| 0.返回 |"<<endl;
cout<<"| * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |"<<endl;
cin>>choice;
switch(choice)
{
case '1'://1.加入到尾部
f.seekp(0,ios::end); //移动文件流指针到文件末尾位置
InputDetails(f,RF,fileName); //为对象RF的数据成员赋值
//RF.ReleaseSpace(); //如果数据结点不为空,释放空间
RF.SequenceWriteHead(f); //对记录头进行顺序写
RF.SequenceWriteData(f); //对数据部分进行顺序写
break;//end case 1
case '2'://2.插到指定位置之前
f.seekp(0,ios::end); //移动文件流指针到文件末尾位置
if(!f.tellp())
{
cout<<"该记录文件为空,请选择:1.加入到尾部."<<endl;
break;
}//end if
else{
cout<<"请指定插入方式(按记录号为1,按记录标识为2):"<<endl;
cin>>choice;
switch(choice)
{
case '1'://按记录号
cout<<"请输入记录号:"<<endl;
cin>>n;
posEnd=f.tellp(); //得到末尾位置信息
f.seekp(0); //记录文件指针指向开头
do{ //查找与记录号匹配的记录
RF.SequenceReadHead(f);
f.seekp(RF.GetLength(),ios::cur);
track=f.tellp();
}while(RF.GetNum()!=n&&track!=posEnd);
if(RF.GetNum()==n&&!RF.GetDeletionSign()){
cout<<"找到该记录!"<<endl;
cout<<"请输入新记录的具体信息:"<<endl;
RFLength=sizeof(RecordNode)+RF.GetLength();
f.seekp(-RFLength,ios::cur); //记录文件指针复位一个RF的长度
posCur=f.tellp(); //得到当前位置信息
temp.open("temp.dat",ios::binary|ios::in|ios::out|ios::trunc);
if(!temp)
{
cerr<<"temp.dat文件不能打开!"<<endl;
return;
}
f.seekp(0,ios::end);
posEnd=f.tellp();
f.seekp(0);
track=f.tellp();
while(track!=posEnd) //将记录文件内容放到临时文件中
{
RF.ReleaseSpace();
RF.SequenceReadHead(f);
RF.SequenceWriteHead(temp);
RF.SequenceReadData(f);
RF.SequenceWriteData(temp);
track=f.tellp();
}
/*关闭多媒体文件,再次打开多媒体文件,以使里面全部内容删去*/
f.close();
f.open(fileName,ios::in|ios::out|ios::binary|ios::trunc);
temp.seekp(0); //将临时文件指针放到开头
track=temp.tellp();
while(track!=posCur)
{//将临时文件posCur之前的内容复制到多媒体文件里
RF.ReleaseSpace();
RF.SequenceReadHead(temp);
RF.SequenceWriteHead(f);
RF.SequenceReadData(temp);
RF.SequenceWriteData(f);
track=temp.tellp();
}
InputDetails(temp,RF,fileName); //为对象RF的数据成员赋值
RF.SequenceWriteHead(f); //对记录头进行顺序写
RF.SequenceWriteData(f); //对数据部分进行顺序写
while(track!=posEnd)
{ //将临时文件后面的内容复制到多媒体文件里
RF.ReleaseSpace();
RF.SequenceReadHead(temp);
RF.SequenceWriteHead(f);
RF.SequenceReadData(temp);
RF.SequenceWriteData(f);
track=temp.tellp();
}
temp.close();
temp.open("temp.dat",ios::binary|ios::in|ios::out|ios::trunc);
temp.close();
}//end if
else{
cout<<"没有找到匹配记录号!请重新确定输入是否有误"<<endl;
}//end else
break;//end case 1
case '2'://按记录标识
cout<<"请输入记录标识:"<<endl;
cin>>k;
posEnd=f.tellp(); //得到末尾位置信息
f.seekp(0,ios::beg);
do{ //查找与记录标识匹配的记录
RF.SequenceReadHead(f);
f.seekp(RF.GetLength(),ios::cur);
track=f.tellp();
}while(strcmp(RF.GetKey(),k)!=0&&track!=posEnd);
if(strcmp(RF.GetKey(),k)==0&&!RF.GetDeletionSign()){
cout<<"找到该记录!"<<endl;
cout<<"请输入新记录的具体信息:"<<endl;
RFLength=sizeof(RecordNode)+RF.GetLength();
f.seekp(-RFLength,ios::cur); //记录文件指针回溯一个RF的长度
posCur=f.tellp(); //得到当前位置信息
temp.open("temp.dat",ios::binary|ios::in|ios::out|ios::trunc);
if(!temp)
{
cerr<<"temp.dat文件不能打开!"<<endl;
return;
}
f.seekp(0,ios::end);
posEnd=f.tellp();
f.seekp(0);
track=f.tellp();
while(track!=posEnd) //将记录文件内容放到临时文件中
{
RF.ReleaseSpace();
RF.SequenceReadHead(f);
RF.SequenceWriteHead(temp);
RF.SequenceReadData(f);
RF.SequenceWriteData(temp);
track=f.tellp();
}
/*关闭多媒体文件,再次打开多媒体文件,以使里面全部内容删去*/
f.close();
f.open(fileName,ios::in|ios::out|ios::binary|ios::trunc);
temp.seekp(0); //将临时文件指针放到开头
track=temp.tellp();
while(track!=posCur)
{//将临时文件posCur之前的内容复制到多媒体文件里
RF.ReleaseSpace();
RF.SequenceReadHead(temp);
RF.SequenceWriteHead(f);
RF.SequenceReadData(temp);
RF.SequenceWriteData(f);
track=temp.tellp();
}
InputDetails(temp,RF,fileName); //为对象RF的数据成员赋值
RF.SequenceWriteHead(f); //对记录头进行顺序写
RF.SequenceWriteData(f); //对数据部分进行顺序写
while(track!=posEnd)
{ //将临时文件后面的内容复制到多媒体文件里
RF.ReleaseSpace();
RF.SequenceReadHead(temp);
RF.SequenceWriteHead(f);
RF.SequenceReadData(temp);
RF.SequenceWriteData(f);
track=temp.tellp();
}
temp.close();
temp.open("temp.dat",ios::binary|ios::in|ios::out|ios::trunc);
temp.close();
}//end if
else{
cout<<"没有找到匹配记录号!请重新确定输入是否有误"<<endl;
}//end else
break;//end case 2
default:cout<<"输入错误,自动返回到上一步!"<<endl<<endl;
}//end switch
}//end else
break;//end case 2
case '3'://3.插入到当前记录之前
posCur=f.tellp(); //记录当前位置信息
f.seekp(0,ios::end); //记录文件指针指向末尾
posEnd=f.tellp(); //得到末尾位置信息
f.seekp(posCur,ios::beg);
temp.open("temp.dat",ios::binary|ios::in|ios::out|ios::trunc);
if(!temp)
{
cerr<<"temp.dat文件不能打开!"<<endl;
return;
}
f.seekp(0);
track=f.tellp();
while(track!=posEnd) //将记录文件内容放到临时文件中
{
RF.ReleaseSpace();
RF.SequenceReadHead(f);
RF.SequenceWriteHead(temp);
RF.SequenceReadData(f);
RF.SequenceWriteData(temp);
track=f.tellp();
}
/*关闭多媒体文件,再次打开多媒体文件,以使里面全部内容删去*/
f.close();
f.open(fileName,ios::in|ios::out|ios::binary|ios::trunc);
temp.seekp(0); //将临时文件指针放到开头
track=temp.tellp();
while(track!=posCur)
{//将临时文件posCur之前内容复制到多媒体文件里
RF.ReleaseSpace();
RF.SequenceReadHead(temp);
RF.SequenceWriteHead(f);
RF.SequenceReadData(temp);
RF.SequenceWriteData(f);
track=temp.tellp();
}
InputDetails(temp,RF,fileName); //为对象RF的数据成员赋值
RF.SequenceWriteHead(f); //对记录头进行顺序写
RF.SequenceWriteData(f); //对数据部分进行顺序写
while(track!=posEnd)
{ //将临时文件后面的内容复制到多媒体文件里
RF.ReleaseSpace();
RF.SequenceReadHead(temp);
RF.SequenceWriteHead(f);
RF.SequenceReadData(temp);
RF.SequenceWriteData(f);
track=temp.tellp();
}
temp.close();
temp.open("temp.dat",ios::binary|ios::in|ios::out|ios::trunc);
temp.close();
break;//end case 3
case '0'://0.返回
cout<<"你确实想返回吗?(Y/N)"<<endl;
cin>>ch;
if(ch=='y'||ch=='Y') return;
else break;//end case 0
default:cout<<"输入选项错误,请重新输入!\n\n";
} //end switch
} //end while
}
/**************************************************************/
void DeleteRecord(fstream & f) //删除记录
{
char choice,ch;
char k[KEYLENGTH];//记录标识
int n; //记录号
RecordFile RF; //声明对象
long RFLength; //对象RF的长度
long posEnd; //记录末尾位置信息
long track; //用于跟踪指针位置
f.seekp(0,ios::end);
posEnd=f.tellp();
if(posEnd==0)
{
cerr<<"该记录文件为空,系统将自动返回至上一级菜单."<<endl;
return;
}
while(1)
{
cout<<"| * * * * * * * * * * * * *删除记录* * * * * * * * * * * * * |"<<endl;
cout<<"| 请键入操作选择: |"<<endl;
cout<<"| 1.按记录号删除 |"<<endl;
cout<<"| 2.按记录标识删除 |"<<endl;
cout<<"| 3.删除当前记录 |"<<endl;
cout<<"| 0.返回 |"<<endl;
cout<<"| * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |"<<endl;
cin>>choice;
//RF.ReleaseSpace(); //释放数据部分空间
switch(choice)
{
case '1'://1.按记录号删除
cout<<"请输入要删除记录的记录号:"<<endl;
cin>>n;
f.seekp(0); //记录文件指针指向开头
do{ //查找与记录号匹配的记录
RF.SequenceReadHead(f);
f.seekp(RF.GetLength(),ios::cur);
track=f.tellp();
}while(RF.GetNum()!=n&&track!=posEnd);
if(RF.GetNum()==n){
cout<<"找到该记录,确定要删除吗?(Y/N)"<<endl;
cin>>ch;
if(ch=='y'||ch=='Y')
{
RFLength=sizeof(RecordNode)+RF.GetLength();
f.seekp(-RFLength,ios::cur); //记录文件指针复位一个RF的长度
RF.SetDeletionSign(1); //将删除标志设为1
RF.SequenceWriteHead(f); //对记录头进行顺序写
f.seekp(RF.GetLength(),ios::cur);
cout<<"该记录已经被删除!"<<endl;
}
}
else
cout<<"没找到该记录,请确定输入是否有误,系统将自动返回至上一步"<<endl;
break;//end case 1
case '2'://2.按记录标识删除
cout<<"请输入要删除记录的记录标识:"<<endl;
cin>>k;
f.seekp(0,ios::beg);
do{ //查找与记录标识匹配的记录
RF.SequenceReadHead(f);
f.seekp(RF.GetLength(),ios::cur);
track=f.tellp();
}while(strcmp(RF.GetKey(),k)!=0&&track!=posEnd);
if(strcmp(RF.GetKey(),k)==0){
cout<<"找到该记录,确定要删除吗?(Y/N)"<<endl;
cin>>ch;
if(ch=='y'||ch=='Y')
{
RFLength=sizeof(RecordNode)+RF.GetLength();
f.seekp(-RFLength,ios::cur); //记录文件指针复位一个RF的长度
RF.SetDeletionSign(1); //将删除标志设为1
RF.SequenceWriteHead(f); //对记录头进行顺序写
f.seekp(RF.GetLength(),ios::cur);
cout<<"该记录已经被删除!"<<endl;
}
}
else
cout<<"没找到该记录,请确定输入是否有误,系统将自动返回至上一步"<<endl;
break;//end case 2
case '3'://3.删除当前记录
cout<<"确定要删除当前记录吗?(Y/N)"<<endl;
cin>>ch;
if(ch=='y'||ch=='Y')
{
RF.SequenceReadHead(f); //对记录头进行顺序读
RF.SetDeletionSign(1); //将删除标志设为1
f.seekp(-sizeof(RecordNode),ios::cur);//记录文件指针复位RecordNode长度
RF.SequenceWriteHead(f);
f.seekp(RF.GetLength(),ios::cur);
cout<<"该记录已经被删除!"<<endl;
}
break;//end case 3
case '0'://0.返回
cout<<"你确实想返回吗?(Y/N)"<<endl;
cin>>ch;
if(ch=='y'||ch=='Y') return;
else break;//end case 0
default:cout<<"输入选项错误,请重新输入!\n\n";
} //end switch
} //end while
}
/**************************************************************/
void LocateRecord(fstream & f) //定位记录
{
char choice,ch;
char k[KEYLENGTH];//记录标识
int n; //记录号
RecordFile RF; //声明对象
long RFLength; //对象RF的长度
long posEnd; //记录末尾位置信息
long posCur; //记录当前位置信息
long track; //用于跟踪指针位置
posCur=f.tellp();
f.seekp(0,ios::end);
posEnd=f.tellp();
if(posEnd==0)
{
cerr<<"该记录文件为空,系统将自动返回至上一级菜单."<<endl;
return;
}
f.seekp(posCur,ios::beg);
while(1)
{
cout<<"| * * * * * * * * * * * * *删除记录* * * * * * * * * * * * * |"<<endl;
cout<<"| 请键入操作选择: |"<<endl;
cout<<"| 1.顺序移动记录指针 |"<<endl;
cout<<"| 2.按记录号定位记录 |"<<endl;
cout<<"| 3.按记录标识定位记录 |"<<endl;
cout<<"| 0.返回 |"<<endl;
cout<<"| * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |"<<endl;
cin>>choice;
switch(choice)
{
case '1'://1.顺序移动记录指针
posCur=f.tellp();
cout<<"请选择指针移动方向(1.向后 2.向前):"<<endl;
cin>>choice;
switch(choice)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -