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

📄 filelibrary.cpp

📁 设计一个类库
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			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 + -