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
*********************/