Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КЛ_ТехнолПрогр2010_090103.doc
Скачиваний:
22
Добавлен:
27.04.2019
Размер:
1.35 Mб
Скачать

9.2. Файловая обработка объектов классов пользователя

Рассмотрим сериализацию данных классов пользователя.

Пусть создан новый класс пользователя СData. Включим в класс документа Clab4_2Doc объект нового класса DataObject:

Попытаемся выполнить все операции для сериализации. Проблема возникает в том, что нельзя воспользоваться функцией Serialize(). Придется запрограммировать процесс сериализации.

Общий принцип ООП состоит в том, что объект класса должен работать со своими собственными данными. Поэтому, необходимо добавить элемент-функцию Serialize () в новый класс.

Для сериализации данных класса пользователя необходимо выполнить следующие операции:

- Объявить класс, производный от CObject.

- В объявление класс включить макрос DECLARE_SERIAL (<имя класса>), служащий для включения дополнительных членов, которые необходимы для сериализации.

- Включить в реализацию класса (в файл CData.cpp) макрос IMPLEMENT_SERIAL. Этот макрос сопряжен с предыдущим: он обеспечивает реализацию сериализации. Три аргумента макроса – это имя класса, имя базового класса, номер схемы (1 или 0).

- Перегрузить функцию Serialize (), унаследованную от базового класса, т.е. добавить функцию Serialize () в класс пользователя.

//CData.h

сlass CData : public CObject

{//...

CString data;

DECLARE_SERIAL (CData) ;

void Serialize (CArchive& archive) ;

} ;

//CData.cpp

void CData :: Serialize (CArchive& archive) ;

{

CObject :: Serialize (archive) ; // Стандартный прием.

if (archive.IsStoring())

{

archive<<data ; // data - элемент класса CData

}

else

{

archive>>data ;

}

}

IMPLEMENT_SERIAL (CData,CObject,0) ;

Для элементов класса CData сериализация выполнена.

Для выполнения сериализации объекта класса (в нашем примере это DataObject) следует вызвать функцию Serialize () класса CData внутри функции Serialize () документа, например,:

void Clab4_2Doc :: Serialize (CArchive& ar)

{

DataObject.Serialize(ar) ;

}

Цель работы - чтение и запись с диска не стандартных объектов MFC, объектов классов пользователя (лаб. работа lab4_2 – [7, c.43]). Пусть имеется собственный класс CData. Выполнить файловую обработку.

Для создания приложения lab4_2 выполнить этапы:

- Создание проекта lab4_2 (SDI-приложение),

- добавление нового класса в проект,

- ввод данных с клавиатуры,

- вывод текущего состояния документа,

- модификация собственного класса,

- создание новой версии Serialize() собственного класса,

- вызов Serialize нового класса внутри Serialize() документа.

Скомпилировать и протестировать приложение

9.3. Файловая обработка с классом cFile

Метод обработки файлов с использованием класса CFile позволяет создавать базы данных любого типа, иметь любой доступ к данным файла.

Цель работы - использование класса CFile для файлов любых типов (лаб. работа lab4_3 – [7, c.47]).

Приложения на базе диалогового окна не имеют класса документа и встроенного меню File с командами Save As, Open, New. Часто необходимы нестандартные операции файловой обработки, не соответствующие технологии сохранения и восстановления данных.

Класс CFile имеет все функции, необходимые для обработки файлов любых типов с последовательным или прямым доступом.

Создадим приложение на базе диалогового окна.

Начальное состояние окна – два текстовых поля и кнопка с надписью Запись и чтение файла. В первом верхнем текстовом поле имеется строка с результатами олимпиады: “1 Иванов 20 2 Петров 19 3 Сидоров 18”, второе нижнее текстовое поле – пустое.

При щелчке на кнопке Запись и чтение файла строка записывается в файл spisok.dat, затем читается из файла и выводится во второе текстовое поле.

Для создания приложения lab4_3 выполнить этапы:

- создание проекта lab4_3 (Диалоговое приложение),

- объявление переменных для хранения данных,

Спроектируем содержимое файла данных spisok.dat с фиксированной длиной записи 20 байтов:

Номер записи Место Фио Баллы

0 1 Иванов 20

1 2 Петров 19

2 3 Сидоров 18

Объявим для хранения данных в ОП массив char OutString[3][20], а для вывода - временный массив char InString[20].

- добавление элементов управления в диалоговое окно,

- связывание элементов управления диалогового окна с

функциями-обработчиками сообщений

- связывание переменных класса с элементами окна,

- запись в файл,

- чтение файла,

Скомпилировать, запустить и протестировать приложение.

Контрольные вопросы

  1. Что такое сериализация?

  2. Как сделать сериализацию для стандартных объектов?

  3. Как сделать сериализацию для нестандартных объектов?

  4. Как пользоваться классом CFile для файловой обработки?

  5. Перечислите этапы обработки с классом CFile.

  6. Объясните назначение основных функций класса CFile.