C++/File/Object Serialize

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Save and read class back and forth to a file

<source lang="cpp">

  1. include <iostream>
  2. include <fstream>
  3. include <cstring>

using namespace std; class Person {

 char name[80];
 char areaCode[4];
 char prefix[4];
 char num[5];

public:

 Person() { };
 Person(char *n, char *a, char *p, char *nm)
 {
   strcpy(name, n);
   strcpy(areaCode, a);
   strcpy(prefix, p);
   strcpy(num, nm);
 }
 friend ostream &operator<<(ostream &stream, Person o);
 friend istream &operator>>(istream &stream, Person &o);

}; ostream &operator<<(ostream &stream, Person o) {

 stream << o.name << " ";
 stream << "(" << o.areaCode << ") ";
 stream << o.prefix << "-";
 stream << o.num << endl;
 return stream; // must return stream

} istream &operator>>(istream &stream, Person &o) {

 cout << "Enter name: ";
 stream >> o.name;
 cout << "Enter area code: ";
 stream >> o.areaCode;
 cout << "Enter prefix: ";
 stream >> o.prefix;
 cout << "Enter number: ";
 stream >> o.num;
 cout << endl;
 return stream;

} int main() {

 Person personObject;
 char c;
 fstream pb("phone", ios::in | ios::out | ios::app);
 if(!pb) {
   cout << "Cannot open phone book file.\n";
   return 1;
 }
 for(;;) {
   do {
     cout << "1. Enter numbers\n";
     cout << "2. Display numbers\n";
     cout << "3. Quit\n";
     cout << "\nEnter a choice: ";
     cin >> c;
   } while(c < "1" || c > "3");
   switch(c) {
     case "1":
       cin >> personObject;
       cout << "Entry is: ";
       cout << personObject;                       
       pb << personObject;                         
       break;
     case "2":
       char ch;
       pb.seekg(0, ios::beg);
       while(!pb.eof()) {
         pb.get(ch);
         if(!pb.eof()) 
            cout << ch;
       }
       pb.clear();                      
       cout << endl;
       break;
     case "3":
       pb.close();
       return 0;
   }
 }

}


      </source>


Serialize object Demo

<source lang="cpp">

  1. include <iostream>
  2. include <fstream>
  3. include <cstring>

using namespace std;

  1. define SIZE 40

class Product {

 char item[SIZE]; 
 int onhand;      
 double cost;     

public:

 Product(char *i, int o, double c)
 {
   strcpy(item, i);
   onhand = o;
   cost = c;
 }
 void store(fstream &stream);
 void retrieve(fstream &stream);
 friend ostream &operator<<(ostream &stream, Product ob);
 friend istream &operator>>(istream &stream, Product &ob);

}; ostream &operator<<(ostream &stream, Product ob) {

 stream << ob.item << ": " << ob.onhand;
 stream << " on hand at $" << ob.cost << "\n";
 return stream;

} istream &operator>>(istream &stream, Product &ob) {

 cout << "Enter item name: ";
 stream >> ob.item;
 cout << "Enter number on hand: ";
 stream >> ob.onhand;
 cout << "Enter cost: ";
 stream >> ob.cost;
 return stream;

} void Product::store(fstream &stream) {

 stream.write(item, SIZE);
 stream.write((char *) &onhand, sizeof(int));
 stream.write((char *) &cost, sizeof(double));

} void Product::retrieve(fstream &stream) {

 stream.read(item, SIZE);
 stream.read((char *) &onhand, sizeof(int));
 stream.read((char *) &cost, sizeof(double));

} int main() {

 fstream fileStream("fileStream", ios::out | ios::binary); 
 int i;
 Product productObject1("p", 12, 4.95);
 Product productObject2("h", 5, 9.45);
 Product productObject3("w", 22, 13.90);
 Product productObject4("", 0, 0.0);
 if(!fileStream) {
   cout << "Cannot open file for output.\n";
   return 1;
 }
 // write to file
 productObject1.store(fileStream);
 productObject2.store(fileStream);
 productObject3.store(fileStream);
 fileStream.close();
 // open for input
 fileStream.open("fileStream", ios::in | ios::binary); 
 if(!fileStream) {
   cout << "Cannot open file for input.\n";
   return 1;
 }
 do {
   cout << "Record # (-1 to quit): ";
   cin >> i;
   if(i == -1) 
      break;
   fileStream.seekg(i*(SIZE+sizeof(int)+sizeof(double)), ios::beg);
   productObject4.retrieve(fileStream);
   cout << productObject4;
 } while(fileStream.good());
 fileStream.close();
 return 0;

}


      </source>