Тема 10. Технология программирования в Widows

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

Файловая обработка с классом CFile

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

Файловая обработка объектов класса MFC

Тема 9. Программирование файловой обработки

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

1. Как создать меню?

2. Что такое клавиши ускоренного вызова, акселераторы?

3. Зачем нужны новые кнопки на панели инструментов?

4. Как создать диалоговое окно в программе?

5. Каким образом добавляются элементы управления в диалоговое окно?

6. Чем отличаются переключатели и флажки?

7. Объясните сущность линейного регулятора.

8. Чем отличаются списки и комбинированные поля?

Сериализация – это процесс сохранения и загрузки данных с диска. В VC++ имеются встроенные средства управления файлами, обеспечивающие автоматизацию сериализации собственных типов данных. Созданное с помощью AppWizard приложения имеют встроенное меню File с командами New, Open, Save as.

Функции-обработчики команд меню File сначала открывают файл, а затем вызывают элемент-функцию Serialize() класса документа приложения. Эта функция и выполняет чтение и запись данных. Пример:

void Clab4_1Doc::Serialize (CArchive& ar)

{

if (ar.IsStoring()) // cохранение (запись на диск)

{// добавить код сохранения

ar<< DataObject;

}

else

{// добавить код загрузки

ar>> DataObject;

}

}

Функция принимает ссылку на объект класса CArchive. Класс CArchive осуществляет передачу документов в архив и обратно.

Функции базового ввода-вывода класса CArchive:

- UINT Read(void* lpBuf, UINT nMax); //чтение с диска

- void Write(const void* lpBuf, UINT nMax); //запись на диск

- операторы <<,>>. //операторы записи и чтения;

- Bool ReadString(CString& pString); //чтение строки

- Bool WriteString(CString& pString); //запись строки

- GetFile(); //статус

- IsLoading(); //проверка загрузки: не 0 - хорошо; 0 - плохо

- IsStoring(); //проверка сохранения: не 0 - хорошо; 0 - плохо

Элемент-функция IsStoring () класса CArchive возвращает true, если файл открыт на запись, и false, если файл открыт на чтение.

Функция Serialize () может записывать и читать с помощью операций вставки << и извлечения >> данные, имеющие базовые типы данных: int, float, double, BYTE, WORD, LONG, DWORD.

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

- Создание элементов-данных класса документа.

- Инициализация этих элементов-данных в функциях класса документа OnNewDocument () и в конструкторе.

- Организация отображения документа в функции OnDraw.

- Включение элементов-функций класса представления, обеспечивающих редактирование документа.

- Добавление кода функции Serialize ().

Цель работы - чтение и запись с диска стандартных объектов MFC; работа команд меню File (лаб. работа lab4_1 – [7, c.41]).

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

- добавление элементов-данных класса документа, которые будут записываться и читаться с диска;

- инициализация этих элементов-данных в функции OnNewDocument() класса документа и в конструкторе документа;

- ввод данных с клавиатуры, если это необходимо, например, в функции OnChar() для ввода символов строки;

- организация вывода документа (функция OnDraw());

- включение в класс вида функций редактирования;

- модернизация функции Serialize() т.е. включение операторов, обеспечивающих сохранение (Save) и загрузку (Open) данных, которые представляют собой содержание документа.

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

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

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

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

класса и в OnNewDocument(),

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

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

- сообщение приложению об изменении данных,

- модификация функции Serialize().

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

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

Пусть создан новый класс пользователя С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() документа.

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

Метод обработки файлов с использованием класса 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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: