Главная->Інформатика та програмування->Содержание->Ввод/вывод множества объектов

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

Ввод/вывод множества объектов

Предыдущие программы записывали и читали только один объект за раз. В сле-

дующем примере в файл записывается произвольное число объектов. Затем они

считываются, и на экран выводится целиком содержимое файла.

Листинг 12.12. Программа DISKFUN

// diskfun.cpp

// Чтение из файла и запись нескольких объектов

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

#include <iostream>

using namespace std;

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

class person            // класс person

  {

  protected:

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

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

  public:

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

      {

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

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

      }

    void showData()     // вывод данных о человеке

 

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

      {

      cout << "\n  Имя: " << name;

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

      }

  };

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

int main()

{

  char ch;

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

  fstream file;         // создать входной/выходной файл

                        // открыть для дозаписи

  file.open("GROUP.DAT", ios::app | ios::out |

                      ios::in | ios::binary );

  do                    // данные от пользователя – в файл

    {

    cout << "\nВведите данные о человеке:";

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

                        // записать их в файл

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

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

    cin >> ch;

    }

  while(ch=='y');       // выход по 'n'

  file.seekg(0);        // поставить указатель на начало файла

                        // считать данные о первом человеке

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

  while( !file.eof() )  // Выход по EOF

    {

    cout << "\nПерсона:"; //вывести данные

    pers.showData();      //считать данные о следующем

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

    }

  cout << endl;

  return 0;

}

Покажем пример взаимодействия при работе программы DISKFUN. Предпола-

гается, что она уже запускалась и были введены и записаны в файл данные о

двух персонах.

Введите данные о человеке:

Введите имя:Екатерина

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

Продолжить ввод (y/n)? n

Персона:

Имя:Татьяна

Возраст:17

Персона:

Имя:Артур

Возраст:60

Персона:

Имя:Екатерина

Возраст:17

В этом примере к файлу добавляется один объект, затем все содержимое, со-

стоящее из трех объектов, выводится на экран.

 

Класс fstream

До сих пор мы создавали файловые объекты, предназначенные либо для ввода,

либо для вывода. В программе DISKFUN сделана попытка создать файл, который мо-

жет быть использован одновременно как входной и выходной. Это должен быть

объект класса fstream, наследник класса iostream, порожденного классами istream

и ostream, чтобы была возможность поддержки одновременно и ввода, и вывода.

Функция open()

Раньше мы создавали файловый объект и инициализировали его таким выраже-

нием:

ofstream outfile("TEST.TXT");

В программе DISKFUN использован следующий подход: одним выражением

мы создаем файл, а другим его открываем, используя функцию open() (метод

класса fstream). Так полезно делать, когда есть вероятность ошибки при откры-

тии. Можно один раз создать потоковый объект, а затем циклически пытаться

открыть его, не ломая голову над созданием каждый раз нового.

 

27