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

📄 dzy.cpp

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