将类写入文件是比较通用的任务,是写文件索引的基础。进一步可以将b+ tree等东西写入文件
- /*
- *=====================================================================================
- *
- *Filename:classtfile.cpp
- *
- *Description:将类写入文件,必要时候都回到内存中
- *
- *Version:1.0
- *Created:2008年12月26日10时34分50秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=====================================================================================
- */
- #include<iostream>
- #include<fstream>
- usingnamespacestd;
- classperson
- {
- public:
- enum{SIZE=50};
- intid;
- intage;
- charname[SIZE];
- charaddress[SIZE];
- };
- classDatabase
- {
- private:
- fstreamfs;
- stringfilename;
- voidopenf()
- {
- try
- {
- fs.open(this->filename.c_str(),fstream::in|fstream::out|fstream::app);
- }catch(...)
- {}
- }
- public:
- Database(stringfn):filename(fn)
- {
- }
- ~Database()
- {
- if(fs.is_open())
- fs.close();
- }
- //通过id查找位置
- size_tquery(size_tid)
- {
- size_tindex=0;
- if(!fs.is_open())
- openf();
- fs.seekg(0,ios_base::beg);
- while(!fs.eof())
- {
- fs.read(reinterpret_cast<char*>(&index),sizeof(int));
- if(index==id)
- {
- fs.seekg(-sizeof(int),ios_base::cur);
- returnfs.tellg();
- }
- fs.seekg(sizeof(person)-sizeof(int),ios_base::cur);
- }
- fs.close();
- return-1;
- }
- //返回位置n的person记录
- personretrieve(size_tn)
- {
- personp;
- if(!fs.is_open())
- openf();
- intresultindex=query(n);
- if(resultindex!=-1)//找到了
- {
- fs.seekg(resultindex);
- fs.read(reinterpret_cast<char*>(&p),sizeof(person));
- fs.close();
- returnp;
- }
- fs.close();
- throw("noresult");
- }
- //修改位置n的person记录
- intupdate(size_tn,person&p)
- {
- if(!fs.is_open())
- fs.open(filename.c_str(),fstream::in|fstream::out);
- intresultindex=query(n);
- if(resultindex!=-1)//找到了
- {
- fs.seekp(resultindex);
- fs.write(reinterpret_cast<char*>(&p),sizeof(person));
- fs.close();
- return0;
- }
- fs.close();
- return1;
- }
- //添加一个人的记录
- voidadd(person&p)
- {
- if(!fs.is_open())
- openf();
- fs.seekp(0,ios::end);
- fs.write(reinterpret_cast<char*>(&p),sizeof(person));
- fs.close();
- }
- };
- intmain()
- {
- Databasedb("db");
- personp;
- p.id=1;
- p.age=10;
- strcpy(p.name,"person1");
- strcpy(p.address,"hunan");
- personp2;
- p2.id=2;
- p2.age=68;
- strcpy(p2.name,"person2");
- strcpy(p2.address,"guangxi");
- personp3;
- p3.id=3;
- p3.age=333;
- strcpy(p3.name,"person3");
- strcpy(p3.address,"shenzhen");
- db.add(p);
- db.add(p2);
- db.add(p3);
- for(inti=0;i<3;i++)
- {
- try
- {
- personp=db.retrieve(i+1);
- cout<<"p.id="<<p.id<<endl;
- cout<<"p.age="<<p.age<<endl;
- cout<<"p.name="<<p.name<<endl;
- cout<<"p.address="<<p.address<<endl;
- }catch(...)
- {
- cout<<"can'tnotfindtheperson"<<i+1<<endl;
- }
- }
- cout<<"change2happend...."<<endl;
- personppp;
- ppp.id=1;
- ppp.age=222;
- strcpy(ppp.name,"newperson1");
- strcpy(ppp.address,"中华人们公共和国");
- db.update(1,ppp);//修改
- for(inti=0;i<3;i++)
- {
- try
- {
- personp=db.retrieve(i+1);
- cout<<"p.id="<<p.id<<endl;
- cout<<"p.age="<<p.age<<endl;
- cout<<"p.name="<<p.name<<endl;
- cout<<"p.address="<<p.address<<endl;
- }catch(...)
- {
- cout<<"can'tnotfindtheperson"<<i+1<<endl;
- }
- }
- }