⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dzy.cpp

📁 一个数据结构的大作业
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		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 + -