www.pudn.com > Library.rar > Database.cpp
#include "Database.h" templateDatabase ::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(); //显示对象数据 }