ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 12) онлайн

Перегрузка << и >> для файлов

Наш следующий пример продемонстрирует, как перегружаются операторы << и >> в классе Distance для работы с файловым вводом/выводом.

Листинг 12.19. Программа ENGLIO2

// englio2.cpp

// перегружаемые операции << и >> могут работать с файлами

#include <fstream>

#include <iostream>

using namespace std;

class Distance            // класс английских расстояний

  {

  private:

    int feet;

    float inches;

  public:

    Distance() : feet(0), inches(0.0) // конструктор (без

                                      // аргументов)

      {  }                // конструктор (два аргумента)

    Distance(int ft, float in) : feet(ft), inches(in)   

      {  }

    friend istream& operator >> (istream& s, Distance& d);

    friend ostream& operator << (ostream& s, Distance& d);

  };

//---------------------------------------------------------

istream& operator >> (istream& s, Distance& d) //получить

                                               // данные

  {                       // из файла или с клавиатуры

  char dummy;             // для ('), (-) и (")

                          //с помощью перегруженного >>

  s >> d.feet >> dummy >> dummy >> d.inches >> dummy;

  return s;

  }

//---------------------------------------------------------

ostream& operator << (ostream& s, Distance& d) // послать

                          // данные типа Distance

  {                       // в файл или

  s << d.feet << "\'-" << d.inches << '\"';   // на экран

  return s;               // перегруженным <<

  }

Листинг 12.19 (продолжение)

///////////////////////////////////////////////////////////

int main()

{

  char ch;

  Distance dist1;

  ofstream ofile;         // создать и открыть

  ofile.open("DIST.DAT"); // выходной поток

 

  do {

    cout << "\nВведите расстояние: ";

    cin >> dist1;         // получить данные от пользователя

    ofile << dist1;       // записать их в выходной поток

    cout << "Продолжать (y/n)? ";

    cin >> ch;

    } while(ch != 'n'); 

  ofile.close();          // закрыть выходной поток

 

  ifstream ifile;         // создать и открыть

  ifile.open("DIST.DAT"); // входной поток

 

  cout << "\nСодержимое файла:\n";

  while(true)

    {

    ifile >> dist1;       // чтение данных из потока

    if( ifile.eof() )     // выход по EOF

      break;

    cout << "Расстояние = " << dist1 <<endl; //вывод

                                             // расстояний

    }

  return 0;

}

В сами перегружаемые операции мы внесли лишь минимальные изменения. Оператор >> больше не просит ввести входные данные, потому что понимает, что бессмысленно просить о чем-либо файл. Мы предполагаем, что пользователь знает, как точно вводить значения футов и дюймов, включая знаки пунктуации. Оператор << остался без изменений. Программа запрашивает у пользователя входные данные и после получения каждого значения записывает его в файл. Когда пользователь оканчивает ввод данных, программа читает из файла и вы- водит на экран все хранящиеся там значения. Вот пример работы программы:

Введите расстояние: 3'-4.5" Продолжать (y/n)? у

Введите расстояние: 7'-11.25" Продолжать (y/n)? у

Введите расстояние: 11'-б" Продолжать (y/n)? n Содержимое файла: Расстояние = 3'-4.5" Расстояние = 7'-11.25" Расстояние = 11'-б"

Значения расстояний записаны в файле символ за символом. Поэтому реаль- ное содержание файла таково:

3'-4.5"7'-11.25"11'-6"

Если пользователь ошибется при вводе данных, они не будут записаны кор- ректно в файл и не смогут быть прочитаны оператором <<. В реальной програм- ме необходимо проверять, правильно ли производится ввод.

 

42