Студопедия

Главная страница Случайная лекция


Мы поможем в написании ваших работ!

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика



Мы поможем в написании ваших работ!




Сериализация стандартных обьектов

Лабораторная работа № 8

«Работа с файлами»

 

Указания к выполнению лабораторной работы

 

Сериализация

Это процесс записи или чтения некоторого обьекта с носителя информации. В большинстве программ на Visual C++ вся работа с данными происходит в документах, поэтому этот урок будет ориентирован на работу с обьектом документа.

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

Сериализация стандартных обьектов

 

Создание программы writer

При помощи AppWizard создайте однодокументное (SDI) приложение с именем writer:

1. Добавьте код, который позволит приложению получать и отображать вводимые пользоавтелем символы. Эти данные будут храниться в обьекте StringData класса CString, который принадлежит документу:

 

//writerDoc.h : интерфейс класса CWriterDoc

.

.

.

class CWriterDoc : public CDocument

{

protected: //создание только при сериализации

CWriterDoc();

DECLARE_DYNCREATE(CWriterDoc)

 

//Атрибуты

public:

CString StringData;

 

2. Обьект StringData необходимо инициализировать пустой строкой в конструкторе документа:

CWriterDoc::CWriterDoc()

{

StringData = “”;

}

 

3. При помощи ClassWizard свяжите сообщение WM_CHAR с методом OnChar() и затем добавьте код для сохранения вводимых символов в обьекте StringData:

 

void CWriterDoc:: OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

CWriterDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData += nChar;

Invalidate();

 

CView::OnChar(nChar, nRepCnt, nFlags);

}

 

4. Чтобы вводимые пользователем символы отображались в клиентской части программы, добавьте в метод OnDraw следующий фрагмент:

 

void CWriterView::OnDraw(CDC* pDC)

{

CWriterDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

 

pDC->TextOut(0, 0, pDoc->StringData);

}

 

Теперь программа получает символы от пользователя, отображает их в окне и сохраняет в обьект StringData.

Следующий этап решения поставленной задачи заключается в том, чтобы пользователь мог сохранить данные программы и загрузить их с диска.

Сериализация обьекта StringData

Класс документа (файл writerDoc.h) содержит встроенный метод Serialize(), который необходимо изменить следующим образом:

 

void CWriterDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

//код сохранения

ar << StringData;

}

else

{

// код загрузки

ar >> StringData;

}

}

 

В этом методе происходит сериализация обьекта StringData. Для этого методу Serialize() передается ссылка на обьект ar класса CArchive, причем работа с обьектом ar практически не отличается от работы с потоками cout и cin. В этом методе мы вызываем метод IsStoring() обьекта ar, чтобы узнать, был метод вызван для записи или для чтения, затем выполняются операции для сохранения или загрузки данных с диска.

На этом сериализация обьекта StringData окончена. Если пользователь захочет выйти из программы, не сохранив данные, программа должна вывести сообщение, а вернее предложение сохранить изменения в документ. Для этого необходимо сообщить приложению о том, что данные были изменены, это достигается простым вызовом метода класса CDocument - SetModifiedFlag(), в котором устанавливается флаг изменения документа:

void CWriterView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

CWriterDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

 

pDoc->StringData += nChar;

Invalidate();

pDoc->SetModifiedFlag();

 

CView::OnChar(nChar, nRepCnt, nFlags);

}

 

Вот и все! Программа готова к работе.

 


<== предыдущая страница | следующая страница ==>
 | Сериализация нестандартных обьектов

Дата добавления: 2015-06-30; просмотров: 155; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.003 сек.