#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;
}
|