www.pudn.com > Library.rar > Database.cpp


#include "Database.h" 
template  
Database::Database():FileName(T::GetFileName()) 
{ 
	rec_size=sizeof(T); //每笔记录的大小 
	InitMap(); //将文件中的对象读入容器 
} 
 
 
template  
Database::~Database() 
{ 
	SaveMap(); 
} 
 
template  
void Database::Insert(T &Object) //将对象插入容器 
{ 
	MaxID++; //将容器中最大的编号加一 
	Object.SetIndex(MaxID); //设定要插入对象的编号 
 
	RecMap.insert(mmtype::value_type(Object.GetName(),Object)); //将对象插入容器中 
} 
 
template  
T* Database::Query(string ObjName)  //从容器中查询对象 
{ 
	mmtype::iterator iter; 
 
	iter=RecMap.find(ObjName); //寻找对象 
 
	if(iter==RecMap.end()) //如果找不到对象,则抛出异常 
	{ 
		string c_name=typeid(T).name(); 
		int NameLen=c_name.size(); 
		string s="Don't find this"+c_name.substr(6,NameLen)+"'s data!\n"; 
		throw(s); 
	} 
 
	return &(iter->second);  //如果找到就返回该对象指针 
} 
 
template  
void Database::Delete(string ObjName) //删除容器中的对象 
{ 
	Query(ObjName); //寻找对象 
	RecMap.erase(ObjName); //输入要删除对象的名称 
} 
 
template  
void Database::InitMap() //将文件中的对象读入容器中 
{ 
	fstream File; 
	MaxID=0; 
 
	File.open(FileName.data(),ios::in | ios::binary); 
	File.seekg(0,ios::end); //将文件指针移向文件结尾 
 
	if(!File) return; //文件不存在,打开文件失败 
 
	FileLen=File.tellg(); //设定文件长度 
 
	if(FileLen==0)  //如果文件大小为0,则关闭文件 
	{ 
		File.close(); 
		return; 
	} 
 
	T Object; 
	File.seekg(0,ios::beg); 
	do{ 
		//读取对象,寻找最大对象编号,并插入容器 
		File.read((char*) &Object,rec_size); 
		if(Object.GetIndex()>MaxID) 
			MaxID=Object.GetIndex(); 
 
		RecMap.insert(mmtype::value_type(Object.GetName(),Object)); 
	}while(File.tellg() 
void Database::SaveMap() //将容器中的对象输出至文件 
{ 
    mmtype::const_iterator iter; 
	T Object; 
 
	File.open(FileName.data(),ios::binary | ios::trunc); 
 
	for(iter=RecMap.begin();iter!=RecMap.end();++iter) 
		File.write((char*) &iter->second,rec_size); //将对象写入文件 
 
	File.close(); 
} 
 
template  
void Database::ShowAllData() //显示容器中所有元素的数据 
{ 
    mmtype::iterator iter; 
	T Object; 
 
	if(RecMap.empty()) 
		cout<<"no data!"<second).ShowData(); //显示对象数据 
}