📄 dzy.cpp
字号:
case '1'://1.向后
if(posEnd==posCur)
cout<<"指针已在记录文件末尾,不能再往后移!"<<endl;
else{
RF.SequenceReadHead(f);
f.seekp(RF.GetLength(),ios::cur);
cout<<"指针已向后移了一个记录!"<<endl;
}
break;
case '2'://2.向前
if(posCur==0)
cout<<"指针已在记录文件开头,不能再往前移!"<<endl;
else{
RF.SequenceReadHead(f);
f.seekp(RF.GetLength(),ios::cur);
cout<<"指针已向前移了一个记录!"<<endl;
}
break;
default:
cout<<"输入选项有误,系统将自动返回上一步!"<<endl;
}
break;
case '2'://2.按记录号定位记录
cout<<"请指定要定位于哪个记录号之前:"<<endl;
cin>>n;
f.seekp(0);
track=f.tellp();
do{
RF.SequenceReadHead(f);
f.seekp(RF.GetLength(),ios::cur);
}while(RF.GetNum()!=n&&track!=posEnd);
if(RF.GetNum()==n&&!RF.GetDeletionSign()){
RFLength=sizeof(RecordNode)+RF.GetLength();
f.seekp(-RFLength,ios::cur); //记录文件指针复位一个RF的长度
cout<<"指针已定位到指定位置!"<<endl;
}
else
cout<<"记录文件不存在这样的记录号,请确定输入是否有误!"<<endl;
break;
case '3'://3.按记录标识定位记录
cout<<"请指定要定位于哪个记录标识之前:"<<endl;
cin>>k;
f.seekp(0);
track=f.tellp();
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)&&!RF.GetDeletionSign()){
RFLength=sizeof(RecordNode)+RF.GetLength();
f.seekp(-RFLength,ios::cur); //记录文件指针复位一个RF的长度
cout<<"指针已定位到指定位置!"<<endl;
}
else
cout<<"记录文件不存在这样的记录号,请确定输入是否有误!"<<endl;
break;
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 ModifyRecordTag(fstream & f) //修改记录标识
{
char ch;
long posEnd; //记录末尾位置信息
long posCur; //记录当前位置信息
f.seekp(0,ios::end); //移动文件流指针到文件末尾位置
posEnd=f.tellp(); //得到末尾位置信息
RecordFile RF; //声明对象
long RFLength; //对象RF的长度
if(posEnd==0){
cout<<"该记录文件为空,系统将自动返回至上一级菜单."<<endl;
return;
}//end if
cout<<"| * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *|"<<endl;
cout<<"| * * * * * * * * * * * * 修改记录标识 * * * * * * * * * * * *|"<<endl;
cout<<"| * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *|"<<endl;
char k[KEYLENGTH]; //记录标识
while(1)
{
cout<<"请输入要修改的记录标识:"<<endl;
cin>>k;
f.seekp(0);
long track=f.tellp();
do{ //查找与记录标识匹配的记录
RF.SequenceReadHead(f);
f.seekp(RF.GetLength(),ios::cur);
track=f.tellp();
}while(strcmp(RF.GetKey(),k)&&track!=posEnd);
if(!strcmp(RF.GetKey(),k)&&!RF.GetDeletionSign()){
RFLength=sizeof(RecordNode)+RF.GetLength();
f.seekp(-RFLength,ios::cur); //记录文件指针复位一个RF的长度
cout<<"已找到要修改的记录标识!请输入新的记录标识:"<<endl;
cin>>k;
posCur=f.tellp();
while(1)
{
f.seekp(0);
track=f.tellp();
do{
RF.SequenceReadHead(f);
f.seekp(RF.GetLength(),ios::cur);
track=f.tellp();
}while(strcmp(RF.GetKey(),k)&&track!=posEnd);
if(!strcmp(RF.GetKey(),k)&&!RF.GetDeletionSign()){
cout<<"记录文件中已经有同样记录标识,请重新输入!"<<endl;
cin>>k;
}
else{
f.seekp(posCur,ios::beg);
RF.SequenceReadHead(f);
RF.SetKey(k);
f.seekp(-sizeof(RecordNode),ios::cur);
RF.SequenceWriteHead(f);
f.seekp(RF.GetLength(),ios::cur);
cout<<"记录已被修改!要继续修改记录标识吗?(Y/N)"<<endl;
cin>>ch;
if(ch=='y'||ch=='Y')break;
return;
}//end else
}//end while
}//end if
else
cout<<"没有找到该记录标识,请重新输入!"<<endl;
}//end while
}
/**************************************************************/
void RewriteRecord(fstream & f,char * fileName) //重写一条记录
{
char choice,ch;
char k[KEYLENGTH];//记录标识
char path[PATHLENGTH];//存放文件路径
int n; //记录号
long len; //存放记录多媒体文件流中的末尾位置
int t; //记录标签
RecordFile RF; //声明对象
DataNode * head; //存放多媒体文件字节流
fstream temp;
long RFLength; //对象RF的长度
long posEnd; //记录末尾位置信息
long posCur; //记录当前位置信息
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<<"| 0.返回 |"<<endl;
cout<<"| * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |"<<endl;
cin>>choice;
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&&!RF.GetDeletionSign()){
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();
}
RF.SequenceReadHead(temp);
temp.seekp(RF.GetLength(),ios::cur);
track=temp.tellp();
do{
cout<<"请确定多媒体文件的存储方式(提供链接为1,直接存储为2):"<<endl;
cin>>t;
if(t!=1&&t!=2)
cout<<"输入选项有误,请重新输入!"<<endl;
}while(t!=1&&t!=2);
if(t==1){
RF.SetTag(t);
cout<<"请输入多媒体文件的链接地址(长度须小于100个字符):"<<endl;
head=new DataNode;
cin>>head->str;
head->next=NULL;
RF.SetLength(DATANODELENGTH-1);
RF.SetData(head);
}//end if
else{
fstream multiMedia;
cout<<"请输入要直接存储的多媒体文件路径:"<<endl;
cin>>path;
multiMedia.open(path,ios::binary|ios::in); //打开多媒体文件
if(!multiMedia)
{
cerr<<"文件不能打开!"<<endl;
return;
}
cout<<"请稍等..."<<endl;
RF.SetTag(t);
multiMedia.seekg(0,ios::end); //读指针移到文件末尾
len=multiMedia.tellg(); //记录多媒体文件长度
if(!len)
{
cout<<"此多媒体文件为空!"<<endl;
return;
}
multiMedia.seekg(0,ios::beg); //读指针移到文件头
DataNode * s, * p;
head=NULL;
long n,sum=0;
s=new DataNode;
/*下面步骤将多媒体数据用链表连接起来*/
while(sum<len)
{
if(len-sum<DATANODELENGTH-1)
n=len-sum;
else
n=DATANODELENGTH-1;
multiMedia.read(s->str,n);
s->str[n]='\0';
if(head==NULL) head=s;
p=s;
s=new DataNode;
p->next=s;
sum+=DATANODELENGTH-1;
}
p->next=NULL;
delete s;//结束
RF.SetLength(sum); //设置数据部分长度
RF.SetData(head); //设置数据结点头指针
multiMedia.close(); //关闭多媒体文件
}//end else
RF.ReleaseSpace();
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;
case '2'://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;
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();
}
RF.SequenceReadHead(temp);
temp.seekp(RF.GetLength(),ios::cur);
track=temp.tellp();
do{
cout<<"请确定多媒体文件的存储方式(提供链接为1,直接存储为2):"<<endl;
cin>>t;
if(t!=1&&t!=2)
cout<<"输入选项有误,请重新输入!"<<endl;
}while(t!=1&&t!=2);
if(t==1){
RF.SetTag(t);
cout<<"请输入多媒体文件的链接地址(长度须小于100个字符):"<<endl;
head=new DataNode;
cin>>head->str;
head->next=NULL;
RF.SetLength(DATANODELENGTH-1);
RF.SetData(head);
}//end if
else{
fstream multiMedia;
cout<<"请输入要直接存储的多媒体文件路径:"<<endl;
cin>>path;
multiMedia.open(path,ios::binary|ios::in); //打开多媒体文件
if(!multiMedia)
{
cerr<<"文件不能打开!"<<endl;
return;
}
cout<<"请稍等..."<<endl;
RF.SetTag(t);
multiMedia.seekg(0,ios::end); //读指针移到文件末尾
len=multiMedia.tellg(); //记录多媒体文件长度
if(!len)
{
cout<<"此多媒体文件为空!"<<endl;
return;
}
multiMedia.seekg(0,ios::beg); //读指针移到文件头
DataNode * s, * p;
head=NULL;
long n,sum=0;
s=new DataNode;
/*下面步骤将多媒体数据用链表连接起来*/
while(sum<len)
{
if(len-sum<DATANODELENGTH-1)
n=len-sum;
else
n=DATANODELENGTH-1;
multiMedia.read(s->str,n);
s->str[n]='\0';
if(head==NULL) head=s;
p=s;
s=new DataNode;
p->next=s;
sum+=DATANODELENGTH-1;
}
p->next=NULL;
delete s;//结束
RF.SetLength(sum); //设置数据部分长度
RF.SetData(head); //设置数据结点头指针
multiMedia.close(); //关闭多媒体文件
}//end else
RF.ReleaseSpace();
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -