C++/File/Object Serialize
Версия от 17:21, 25 мая 2010; (обсуждение)
Save and read class back and forth to a file
<source lang="cpp">
- include <iostream>
- include <fstream>
- 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">
- include <iostream>
- include <fstream>
- include <cstring>
using namespace std;
- 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>