#include <iostream.h>
#include <fstream.h>
#include <string>

class Person {
 private:
  int age;
  string phoneNumber;
  string name;
  static const char sep=':';

 public:
  int Age() const { return age; }
  string Name() { return name; }

  void setAge(int a) { age=a; }
  void setName(string s) { name=s; }

  friend istream& operator>>(istream&, Person&);
  friend ostream& operator<<(ostream&, const Person&);
  friend ifstream& operator>>(ifstream&, Person&);
  friend ofstream& operator<<(ofstream&, const Person&);

};

istream& operator >> (istream& i, Person& p)
{

  cout << "Enter name: ";
  i >> p.name;
  
  if (i) {
    cout << "Enter age: ";
    i >> p.age;
    cout << "Enter phone number: ";
    i >> p.phoneNumber; 
  }

  return i; // most common mistake: forgetting to return the stream
}

ostream& operator << (ostream& o, const Person& p)
{
  o << p.name << endl;
  o << "  Age: " << p.age << ", Phone: " << p.phoneNumber << endl;

  return o;  // most common mistake: forgetting to return the stream
}

ifstream& operator >> (ifstream& i, Person& p)
{
  string input;

  getline(i,input,Person::sep);

  if (i) {
      p.age = atoi(input.c_str());
      getline(i,p.phoneNumber,Person::sep);
      if (i)
	getline(i,p.name);
      else {
	cerr << "Bad format for Person." << endl;
	exit(1);
      }
  } 

  return i;
}

ofstream& operator << (ofstream& o, const Person& p)
{
  o << p.age << Person::sep << p.phoneNumber << Person::sep << p.name << endl;

  return o;
}


