Class Templates - Example 10-12 - A generic File I/O Class

// File: ex10-12.cpp - A generic file IO class

#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

template <typename T>
class io {
private:
	fstream file;
	int eof() { return file.eof(); }
public:
	io(char* filename) {
		file.open(filename,ios::in|ios::out|ios::trunc);
	}
	void rewind() { file.seekg(0L); file.seekp(0L); file.clear(); }
	io& operator>>(T& t);
	io& operator<<(const T& t);
	operator int() {
		if (eof()) return 0;
		else return 1;
	}
};

template <typename T>
io<T>& io<T>::operator<<(const T& t) {
	file.write((char*) &t,sizeof(T));
	return *this;
}

template <typename T>
io<T>& io<T>::operator>>(T& t) {
	file.read((char*)&t,sizeof(T));
	return *this;
}

class A {
	int a;
public:
	friend istream& operator>>(istream& in, A& AA);
	friend ostream& operator<<(ostream& out, A& AA);
};

istream& operator>>(istream& in, A& AA) {
	cout << "Enter an int for a class A object => ";
	return in >> AA.a;
}

ostream& operator<<(ostream& out, A& AA) {
	return out << AA.a;
}

class B {
protected:
	double bl;
	char b2[5] ;
	long b3;
public:
	friend istream& operator>>(istream& in, B& BB);
	friend ostream& operator<<(ostream& out, B& BB);
};

istream& operator>>(istream& in, B& BB) {
	cout << "Enter double, char* and long for a class B object => ";
	return in >> BB.bl >> BB.b2 >> BB.b3;
}

ostream& operator<<(ostream& out, B& BB) {
	return out << BB.bl << ' ' << BB.b2 << ' ' << BB.b3;
}

int main(void) {
	A apple;
	io<A> appleIO("apple.dat");
	B banana;
	io<B> bananaIO("banana.dat");
	cin >> apple;
	appleIO << apple;
	cin >> apple;
	appleIO << apple;
	cin >> banana;
	bananaIO << banana;
	cin >> banana;
	bananaIO << banana;
	cin >> banana;
	bananaIO << banana;
	appleIO.rewind();
	while (appleIO >> apple) cout << apple << endl;
	bananaIO.rewind();
	while (bananaIO >> banana) cout << banana << endl;
	return 0;
}
/********************** output ********************************
Enter an int for a class A object => 1
Enter an int for a class A object => 443
Enter double, char* and long for a class B object => 2.4 dog 456
Enter double, char* and long for a class B object => 222.1 cat 100
Enter double, char* and long for a class B object => 3.2 help 1000
1
443
2.4 dog 456
222.1 cat 100
3.2 help 1000
*********************/