经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
经典实验--电话号码薄
来源:cnblogs  作者:他乡一故知  时间:2021/6/15 9:19:46  对本文有异议

·一、目的和要求

    设计一个利用文件处理方式实现电话号码薄的程序,具有增加数据、更新数据、查询数据、删除数据以及重组文件的功能,删除数据在记录中作删除标志,重组文件指在物理上删除作有删除标志的记录。

·二、系统分析

    通过菜单选择调用函数来实现相应的功能,这样条理清晰、整体效果好,便于程序的调试。

定义电话结构体:

struct TelephoneType

{     // 电话结构

       bool delTag;                                       // 删除标志

       unsigned int seat;                                // 序号

       char name[16];                                   // 姓名

       char teleNo[18];                                 // 电话号码

};

 

设计电话号码簿类:

/ 电话号码簿类的声明

class TelephoneBook

{

private:

// 数据成员

       fstream file;                                       // 电话号码簿文件

 

// 辅助函数

       void AddData();                                 // 增加数据

       void UpdateData();                             // 更新数据

       void SearchData();                             // 查询数据

       void DeleteData();                              // 删除数据, 只作删除标志

       void Pack();                                       // 在物理上删除作有删除标记的记录

 

public:

// 构造函数, 析构函数与方法

       TelephoneBook();                               // 无参构造函数

       virtual ~TelephoneBook(){ file.close(); }     // 析构函数

       void Run();                                               // 处理电话号码簿

};

·三、程序结果截图

打开界面

 

增加数据

修改信息

查询信息

 

 

删除信息

 

重组文件 退出

 

·四、总结与体会

通过编写电话号码簿的程序,更加深入的理解了C++文件,熟悉了各种对文件操作的函数,并把每个功能用单独的函数分开来编写,提高了代码的效率和可读性。

 

·五、源程序

  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4. using namespace std;
  5. struct TelephoneType{
  6. bool delTag;
  7. unsigned int seat;
  8. char name[16];
  9. char teleNo[18];
  10. };
  11. class TelephoneBook{
  12. private:
  13. fstream file;
  14. void AddData();
  15. void SearchData();
  16. void UpdateData();
  17. void DeleteData();
  18. void Pack();
  19. void ShowData();
  20. public:
  21. TelephoneBook();
  22. virtual~TelephoneBook()
  23. {
  24. file.close();
  25. }
  26. void Run();
  27. };
  28. TelephoneBook::TelephoneBook()
  29. {
  30. ifstream iFile("telph.dat");
  31. if (iFile.fail())
  32. {
  33. ofstream oFile("telph.dat");
  34. if (oFile.fail())
  35. throw("打开文件失败!");
  36. oFile.close();
  37. }
  38. else
  39. {
  40. iFile.close();
  41. }
  42. file.open("telph.dat", ios::in|ios::out|ios::binary);
  43. if (file.fail())
  44. throw("打开文件失败!");
  45. }
  46. void TelephoneBook::AddData()
  47. {
  48. cout<<"\t增加数据"<<endl;
  49. char flag='Y';
  50. TelephoneType tel;
  51. while(toupper(flag)=='Y')
  52. {
  53. cin>>tel.seat>>tel.name>>tel.teleNo;
  54. tel.delTag= true;
  55. file.write((char *)&tel,sizeof(tel));
  56. cout<<"是否继续录入信息?(Y/N)";
  57. cin>>flag;
  58. }
  59. }
  60. void TelephoneBook::SearchData()
  61. {
  62. TelephoneType tel1;
  63. unsigned int seat;
  64. cout<<"输入想要查看的序号:";
  65. cin>>seat;
  66. file.seekg(0);
  67. file.read((char *)&tel1,sizeof(tel1));
  68. while(!file.eof())
  69. {
  70. if(tel1.seat==seat&&tel1.delTag)
  71. break;
  72. file.read((char *)&tel1,sizeof(tel1));
  73. }
  74. if(seat>tel1.seat)
  75. {
  76. cout<<"超出电话信息序号。"<<endl;
  77. }
  78. if(!file.eof())
  79. {
  80. cout<<tel1.seat<<"\t"<<tel1.name<<"\t"<<tel1.teleNo<<"\t"<<tel1.delTag;
  81. }
  82. }
  83. void TelephoneBook::UpdateData()
  84. {
  85. TelephoneType tel2;
  86. unsigned int seat;
  87. cout<<"输入想要修改的序号信息"<<endl;
  88. cin>>seat;
  89. file.seekg(0);
  90. file.read((char *)&tel2,sizeof(tel2));
  91. while(!file.eof())
  92. {
  93. if(seat==tel2.seat)
  94. {
  95. cout<<"显示现有信息:"<<endl;
  96. cout<<"序号"<<"\t"<<"姓名"<<"\t"<<"号码"<<"\t\t"<<"真值"<<endl;
  97. cout<<tel2.seat<<"\t"<<tel2.name<<"\t"<<tel2.teleNo<<"\t"<<tel2.delTag<<endl;
  98. cout<<"写出修改后的信息:"<<endl;
  99. cin>>tel2.seat>>tel2.name>>tel2.teleNo;
  100. file.seekg(-sizeof(TelephoneType), ios::cur);
  101. file.write((char *)&tel2,sizeof(tel2));
  102. break;
  103. }
  104. file.read((char *)&tel2,sizeof(tel2));
  105. }
  106. }
  107. void TelephoneBook::DeleteData()
  108. {
  109. TelephoneType tel3;
  110. unsigned int seat;
  111. cout<<"输入做删除标记的序号信息:"<<endl;
  112. cin>>seat;
  113. file.seekg(0);
  114. file.read((char *)&tel3,sizeof(tel3));
  115. while(!file.eof())
  116. {
  117. if(seat==tel3.seat)
  118. {
  119. break;
  120. }
  121. file.read((char *)&tel3,sizeof(tel3));
  122. }
  123. if(!file.eof())
  124. {
  125. cout<< "被删除记录为:" << endl;
  126. cout<<"\t"<<tel3.seat<<"\t"<<tel3.name<<"\t"<<tel3.teleNo<<endl;
  127. tel3.delTag=false;
  128. file.seekg(-sizeof(TelephoneType), ios::cur);
  129. file.write((char *)&tel3, sizeof(tel3));
  130. cout<<"删除成功!"<<endl;
  131. }
  132. else
  133. {
  134. cout<<"删除失败!"<<endl;
  135. file.clear();
  136. }
  137. }
  138. void TelephoneBook::ShowData()
  139. {
  140. cout<<"\t\t电话簿"<<endl;
  141. TelephoneType tel5;
  142. file.seekg(0);
  143. file.read((char *)&tel5,sizeof(tel5));
  144. while(!file.eof())
  145. {
  146. cout<<tel5.seat<<"\t"<<tel5.name<<"\t"<<tel5.teleNo<<"\t"<<tel5.delTag<<endl;
  147. file.read((char *)&tel5,sizeof(tel5));
  148. }
  149. }
  150. void TelephoneBook::Pack()
  151. {
  152. TelephoneType tel4;
  153. ofstream outfile("temp.dat",ios::app|ios::binary);
  154. file.seekg(0);
  155. file.read((char *)&tel4,sizeof(tel4));
  156. while(!file.eof())
  157. {
  158. if(tel4.delTag)
  159. {
  160. outfile.write((char *)&tel4,sizeof(tel4));
  161. }
  162. file.read((char *)&tel4,sizeof(tel4));
  163. }
  164. file.close();
  165. outfile.close();
  166. remove("telph.dat");
  167. rename("temp.dat","telph.dat");
  168. file.open("telph.dat", ios::in|ios::out|ios::binary);
  169. cout<<"成功删除信息!!!"<<endl;
  170. }
  171. void TelephoneBook::Run()
  172. {
  173. int select;
  174. while(select!=7)
  175. {
  176. cout<<" 电话簿"<<endl;
  177. cout<<"1.增加数据\t2.更新数据"<<endl;
  178. cout<<"3.查询数据\t4.删除数据"<<endl;
  179. cout<<"5.重组文件\t6.查看数据"<<endl;
  180. cout<<"7.退出"<<endl;
  181. cout<<"请输入想要进行的操作";
  182. cin>>select;
  183. switch(select)
  184. {
  185. case 1:AddData();break;
  186. case 2:UpdateData();break;
  187. case 3:SearchData();break;
  188. case 4:DeleteData();break;
  189. case 5:Pack();break;
  190. case 6:ShowData();break;
  191. case 7:break;
  192. }
  193. }
  194. }
  195. int main()
  196. {
  197. TelephoneBook b;
  198. int a;
  199. b.Run();
  200. system("PAUSE");
  201. return 0;
  202. }

 

原文链接:http://www.cnblogs.com/zhang-a-d/p/14863765.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号