fstream 将类写入文件

将类写入文件是比较通用的任务,是写文件索引的基础。进一步可以将b+ tree等东西写入文件
  1. /*
  2. *=====================================================================================
  3. *
  4. *Filename:classtfile.cpp
  5. *
  6. *Description:将类写入文件,必要时候都回到内存中
  7. *
  8. *Version:1.0
  9. *Created:2008年12月26日10时34分50秒
  10. *Revision:none
  11. *Compiler:gcc
  12. *
  13. *Author:LiWeiJian(mn),lwj1396@163.com
  14. *Company:hunanuniversity
  15. *
  16. *=====================================================================================
  17. */
  18. #include<iostream>
  19. #include<fstream>
  20. usingnamespacestd;
  21. classperson
  22. {
  23. public:
  24. enum{SIZE=50};
  25. intid;
  26. intage;
  27. charname[SIZE];
  28. charaddress[SIZE];
  29. };
  30. classDatabase
  31. {
  32. private:
  33. fstreamfs;
  34. stringfilename;
  35. voidopenf()
  36. {
  37. try
  38. {
  39. fs.open(this->filename.c_str(),fstream::in|fstream::out|fstream::app);
  40. }catch(...)
  41. {}
  42. }
  43. public:
  44. Database(stringfn):filename(fn)
  45. {
  46. }
  47. ~Database()
  48. {
  49. if(fs.is_open())
  50. fs.close();
  51. }
  52. //通过id查找位置
  53. size_tquery(size_tid)
  54. {
  55. size_tindex=0;
  56. if(!fs.is_open())
  57. openf();
  58. fs.seekg(0,ios_base::beg);
  59. while(!fs.eof())
  60. {
  61. fs.read(reinterpret_cast<char*>(&index),sizeof(int));
  62. if(index==id)
  63. {
  64. fs.seekg(-sizeof(int),ios_base::cur);
  65. returnfs.tellg();
  66. }
  67. fs.seekg(sizeof(person)-sizeof(int),ios_base::cur);
  68. }
  69. fs.close();
  70. return-1;
  71. }
  72. //返回位置n的person记录
  73. personretrieve(size_tn)
  74. {
  75. personp;
  76. if(!fs.is_open())
  77. openf();
  78. intresultindex=query(n);
  79. if(resultindex!=-1)//找到了
  80. {
  81. fs.seekg(resultindex);
  82. fs.read(reinterpret_cast<char*>(&p),sizeof(person));
  83. fs.close();
  84. returnp;
  85. }
  86. fs.close();
  87. throw("noresult");
  88. }
  89. //修改位置n的person记录
  90. intupdate(size_tn,person&p)
  91. {
  92. if(!fs.is_open())
  93. fs.open(filename.c_str(),fstream::in|fstream::out);
  94. intresultindex=query(n);
  95. if(resultindex!=-1)//找到了
  96. {
  97. fs.seekp(resultindex);
  98. fs.write(reinterpret_cast<char*>(&p),sizeof(person));
  99. fs.close();
  100. return0;
  101. }
  102. fs.close();
  103. return1;
  104. }
  105. //添加一个人的记录
  106. voidadd(person&p)
  107. {
  108. if(!fs.is_open())
  109. openf();
  110. fs.seekp(0,ios::end);
  111. fs.write(reinterpret_cast<char*>(&p),sizeof(person));
  112. fs.close();
  113. }
  114. };
  115. intmain()
  116. {
  117. Databasedb("db");
  118. personp;
  119. p.id=1;
  120. p.age=10;
  121. strcpy(p.name,"person1");
  122. strcpy(p.address,"hunan");
  123. personp2;
  124. p2.id=2;
  125. p2.age=68;
  126. strcpy(p2.name,"person2");
  127. strcpy(p2.address,"guangxi");
  128. personp3;
  129. p3.id=3;
  130. p3.age=333;
  131. strcpy(p3.name,"person3");
  132. strcpy(p3.address,"shenzhen");
  133. db.add(p);
  134. db.add(p2);
  135. db.add(p3);
  136. for(inti=0;i<3;i++)
  137. {
  138. try
  139. {
  140. personp=db.retrieve(i+1);
  141. cout<<"p.id="<<p.id<<endl;
  142. cout<<"p.age="<<p.age<<endl;
  143. cout<<"p.name="<<p.name<<endl;
  144. cout<<"p.address="<<p.address<<endl;
  145. }catch(...)
  146. {
  147. cout<<"can'tnotfindtheperson"<<i+1<<endl;
  148. }
  149. }
  150. cout<<"change2happend...."<<endl;
  151. personppp;
  152. ppp.id=1;
  153. ppp.age=222;
  154. strcpy(ppp.name,"newperson1");
  155. strcpy(ppp.address,"中华人们公共和国");
  156. db.update(1,ppp);//修改
  157. for(inti=0;i<3;i++)
  158. {
  159. try
  160. {
  161. personp=db.retrieve(i+1);
  162. cout<<"p.id="<<p.id<<endl;
  163. cout<<"p.age="<<p.age<<endl;
  164. cout<<"p.name="<<p.name<<endl;
  165. cout<<"p.address="<<p.address<<endl;
  166. }catch(...)
  167. {
  168. cout<<"can'tnotfindtheperson"<<i+1<<endl;
  169. }
  170. }
  171. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值