Ex9_13_1.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:5k
源码类别:

书籍源码

开发平台:

Visual C++

  1. /*例9.13_1  将商店的货物,定义为一个货物数组类,数组对象动态建立,初始为2个元素,不够用时扩充一倍。
  2. 用二进制数据文件建立数组元素对象,要求放在构造函数中,而文件的保存和关闭放在析构函数中。第一次运
  3. 行时,建立空的数据文件,由键盘输入建立数组元素对象,并写入文件,程序退出时,关闭文件;下一次运行
  4. 就可以由文件构造对象,恢复前一次做过的工作。*/
  5. #include<fstream>
  6. #include<iostream>
  7. #include<string>
  8. #include<iomanip>
  9. using namespace std;
  10. class inventory{
  11. string Description;//商品名称
  12. int No;//货号
  13. int Quantity;//数量
  14. double Cost;//价格
  15. double Retail;//零售
  16. public:
  17. inventory(string ="#",int =0,int =0,double =0,double =0);
  18. void Bdatatofile(fstream & dest);    //数据写入文件流类
  19. void Bdatafromfile(fstream & sour);  //由文件流类读入数据
  20. bool operator==(inventory &inven){return No==inven.No;}
  21. bool operator<=(inventory &inven){return No<=inven.No;}
  22. friend ostream&operator<<(ostream&dest,inventory&iv);   //重载插入运算符
  23. friend istream&operator>>(istream&sour,inventory&iv);   //重载提取运算符
  24. };     //流类作为形式参数必须是引用
  25. inventory::inventory(string des,int no,int quan,double cost,double ret){
  26. Description=des;
  27. No=no;
  28. Quantity=quan;
  29. Cost=cost;
  30. Retail=ret;
  31. }
  32. void inventory::Bdatatofile(fstream & dest){
  33. dest.write(Description.c_str(),20);//由string类的c_str()函数转为char*
  34. dest.write((char*)&No,sizeof(int));
  35. dest.write((char*)&Quantity,sizeof(int));
  36. dest.write((char*)&Cost,sizeof(double));
  37. dest.write((char*)&Retail,sizeof(double));
  38. }
  39. void inventory::Bdatafromfile(fstream & sour){
  40. char Desc[20];
  41. sour.read(Desc,20);//必须由字符数组过渡
  42. Description=Desc;
  43. sour.read((char*)&No,sizeof(int));
  44. sour.read((char*)&Quantity,sizeof(int));
  45. sour.read((char*)&Cost,sizeof(double));
  46. sour.read((char*)&Retail,sizeof(double));
  47. }//由此可见读和写是完全对称的过程,次序决不能错
  48. ostream &operator<<(ostream&dest,inventory&iv){
  49. dest<<left<<setw(20)<<iv.Description<<setw(10)<<iv.No;
  50. dest<<right<<setw(10)<<iv.Quantity<<setw(10)<<iv.Cost<<setw(10)<<iv.Retail<<endl;
  51. return dest;
  52. }
  53. istream&operator>>(istream&sour,inventory&iv){
  54. cout<<"请输入货物名称:"<<endl;
  55. sour>>iv.Description;
  56. cout<<"请输入货号:"<<endl;
  57. sour>>iv.No;
  58. cout<<"请输入货物数量:"<<endl;
  59. sour>>iv.Quantity;
  60. cout<<"请输入货物价格:"<<endl;
  61. sour>>iv.Cost;
  62. cout<<"请输入货物零售价格:"<<endl;
  63. sour>>iv.Retail;
  64. return sour;
  65. }
  66. template <typename T>class Array{
  67. T *elements;
  68. int Subscript;           //已用最大下标值
  69. int maxSize;
  70. fstream datafile;
  71. public:
  72. Array(int=2);           //为了便于检验,缺省元素数暂为2
  73. ~Array();
  74. bool IsFull() const{return Subscript==maxSize-1;}
  75. void renews();         //内存扩大一倍
  76. void show(){
  77. cout<<"已用最大下标值"<<Subscript<<'t'<<"可用元素数"<<maxSize<<endl;
  78. }
  79. void ordinsert(T&);    //输入时以货号为关键字排序
  80. friend ostream&operator<<(ostream&dest,Array&ar);
  81. };
  82. template <typename T> Array<T>::Array(int maxs){
  83. maxSize=maxs;
  84. Subscript=-1;//私有数据不容许直接赋初值,必须在构造函数中赋初值
  85. T temp;
  86. elements=new T[maxSize];
  87. datafile.open("mydatafile.dat",ios::binary|ios::in);
  88. if(!datafile==0){
  89. while(!datafile.eof()){
  90. temp.Bdatafromfile(datafile);
  91. if(datafile.eof()==0){//读到无数据可读后,即读入不成功,eofbit为1
  92. ordinsert(temp);//即使原文件未排序,读出也是排好序的,退出时按排好序的重存
  93. }
  94. }
  95. datafile.close();
  96. }
  97. datafile.clear(0);//采用标准库不可少,前面曾经读到过文件结束,无法恢复
  98. }
  99. template <typename T> Array<T>::~Array(){
  100. int i;
  101. datafile.open("mydatafile.dat",ios::binary|ios::out);
  102. for(i=0;i<=Subscript;i++) elements[i].Bdatatofile(datafile);
  103. datafile.close();
  104. delete[]elements;
  105. }
  106. template <typename T> void Array<T>::renews(){
  107. int i;
  108. T *temp=elements;
  109. maxSize*=2;
  110. elements=new T[maxSize];
  111. for(i=0;i<=Subscript;i++) elements[i]=temp[i];
  112. delete[]temp;
  113. }
  114. template <typename T> void Array<T>::ordinsert(T & elem){//输入时以货号为关键字排序
  115. int i,j;
  116. if(IsFull()) renews();
  117. for(i=0;i<=Subscript;i++) if(elem<=elements[i]) break;
  118. if(!(elem==elements[i])){
  119. for(j=Subscript;j>=i;j--) elements[j+1]=elements[j];
  120. Subscript++;
  121. }
  122. elements[i]=elem;
  123. show();
  124. }
  125. template <typename T>ostream&operator<<(ostream&dest,Array<T>&ar){
  126. int i;
  127. for(i=0;i<=ar.Subscript;i++) dest<<ar.elements[i];
  128. return dest;
  129. }
  130. int main(){
  131. Array<inventory> mylist;
  132. inventory temp;
  133. char ch;
  134. cout<<"是否输入新商品?Y or N"<<endl;
  135. cin>>ch;
  136. while(ch=='Y'||ch=='y'){
  137. cin.get();//吸收回车
  138. cin>>temp;
  139. mylist.ordinsert(temp);
  140. cout<<"是否继续输入?Y or N"<<endl;
  141. cin>>ch;
  142. }
  143. cout<<mylist;
  144. return 0;
  145. }