ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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"
Если пользователь ошибется при вводе данных, они не будут записаны кор- ректно в файл и не смогут быть прочитаны оператором <<. В реальной програм- ме необходимо проверять, правильно ли производится ввод.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48