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

Объектный ввод/вывод

Так как C++ — это все-таки объектно-ориентированный язык, было бы интересно

узнать, как происходит запись объектов в дисковые файлы и чтение из них. Сле-

дующий пример демонстрирует этот процесс. Класс person, использовавшийся ра-

нее в нескольких наших программах (например, в VIRTPERS, глава 11, раздел «Вир-

туальные функции»), создает объекты, с которыми мы сейчас будем работать.

Запись объекта на диск

При записи объекта мы обычно используем бинарный режим. При этом на диск

записывается та же битовая конфигурация, что хранится в памяти. Это придает

уверенности в том, что данные объекта будут обработаны корректно. В приводи-

мой ниже программе OPERS у пользователя запрашивается информация об объек-

те класса person, который потом записывается в файл PERSON.DAT.

Листинг 12.10. Программа OPERS

// opers.cpp

// Сохранение объекта в файле

#include <fstream>        // для файловых потоков

#include <iostream>

using namespace std;

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

class person              // класс person

  {

  protected:

    char name[80];        // имя человека

    short age;            // возраст

  public:

    void getData()        // получить данные о человеке

      {

      cout << "Введите имя: "; cin >> name;

      cout << "Введите возраст: "; cin >> age;

      }

  };

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

int main()

{

  person pers;            // создать объект

  pers.getData();         // получить данные

                          // создать объект ofstream

  ofstream outfile("PERSON.DAT", ios::binary);

                          // записать в него

  outfile.write(reinterpret_cast<char*>(&pers), sizeof(pers)); 

  return 0;

}

 

 

Метод getData() класса person вызывается для того, чтобы запросить у поль-

зователя информацию, которая помещается в объект pers. Вот простой пример

взаимодействия:

Введите имя: Артур

Введите возраст: 60

Содержимое данного объекта записывается на диск с помощью функции write().

Для нахождения длины данных объекта pers используется оператор sizeof.

Чтение объекта с диска

Для чтения пригодится метод read(), что продемонстрировано в следующем лис-

тинге.

Листинг 12.11. Программа IPERS

// ipers.cpp

// Чтение объекта из файла

#include <fstream>      // для файловых потоков

#include <iostream>

using namespace std;

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

class person            // класс person

  {

  protected:

    char name[80];      // Имя человека

    short age;          // его возраст

  public:

    void showData()     // вывести данные

      {

      cout << "Имя: " << name << endl;

      cout << "Возраст: " << age << endl;

      }

  };

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

int main()

{

  person pers;          // переменная типа person

  ifstream infile("PERSON.DAT", ios::binary);// создать поток

                        // чтение потока

  infile.read( reinterpret_cast<char*>(&pers), sizeof(pers)); 

  pers.showData();      // вывести данные

  return 0;

}

 

В результате работы программы будет выведено на экран все то, что было

помещено в файл PERSON.DAT программой OPERS:

Имя: Артур

Возраст: 60

 

25