MFC Работа с файлами. Сериализация
Мне необходимо реализовать сохранение данных в файл с помощью сериализации. В меню файлов командами "сохранить как" и "открыть я реализовал", но мне надо реализовать в файл сохранение студента при нажатой кнопке в диалоге. Реализация MFCDoc.h(файл документа): Код:
#pragma once
#include "resource.h"
#include <afxwin.h>
#include "list.h"
#define UPDATE_ADD_STUDENT 1
#define UPDATE_DEL_STUDENT 2
#define UPDATE_EDIT_STUDENT 3
class CursuchDoc : public CDocument
{
protected: // создать только из сериализации
CursuchDoc() noexcept;
DECLARE_DYNCREATE(CursuchDoc)
// Атрибуты
public:
List m_list;
// Операции
public:
// Переопределение
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
....
Реализация MFCDoc.cpp: Код:
void CursuchDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())//запись
{
int nCount = m_list.GetCount();
ar << nCount;
Student* st = m_list.GetFirst();
while (st != NULL)
{
st->Serialize(ar);
st = m_list.GetNext();
}
}
else//чтение
{
int nCount = 0;
ar >> nCount;
for (int i = 0; i < nCount; ++i)
{
Student st;
st.Serialize(ar);
m_list.PushBack(&st);
}
}
}
Мне нужно сделать тоже самое с диалоговой кнопкой. Реализация ясна. Код:
CFile fileIn;
if (!fileIn.Open(m_strfile, CFile::modeWrite | CFile::modeCreate))
{
CString sMsg;
sMsg.Format(L"Не могу открыть файл %s",
m_strfile);
MessageBox(sMsg, L"Ошибка", MB_OK | MB_ICONERROR);
return FALSE;
}
CArchive ar(&fileIn, CArchive::store);
Student tt;
tt.Setf(L"rferf");
hist->PushBack(&tt);
int nCount = hist->GetCount();
ar << nCount;
Student* st = hist->GetFirst();
while (st != NULL)
{
st->Serialize(ar);
st = hist->GetNext();
}
ar.Close();
fileIn.Close();
UpdateData(FALSE);
Вот только студент должен добавляться к существующему списку студентов(m_list в MFCDoc.cpp), а не к пустому. переменная List hist -- неудачная попытка получить ссылку на m_list, объявленный в MFCDOC.h. Я не знаю как получить m_list, который мне нужен то есть из файла, который я открыл. Ведь, когда я в меню открываю свой файл со студентами программа находит нужный список m_list. Вот, что я про это прочитал:
Вот что делает фреймворк, когда пользователь приложения выдает команду «Сохранить как» из меню «Файл»: Представляет поле для диалога Save As и получает имя файла от пользователя. Открывает файл, названный пользователем в CFile качестве объекта. Создает CArchive объект, упомянение на этот CFile объект. При создании CArchive объекта фреймворк устанавливает режим "хранить" (написать, сериализовать), в отличие от "нагрузки" (читай, десериализировать). Вызывает Serialize функцию, CDocument определяемую в вашем классе, передавая ее ссылкой на CArchive объект.
Я хочу сделать тоже самое и хочу вызвать функцию Serialize явно из CDocument или как-то получить указатель на список m_list, но я не знаю как это сделать.