Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 19.05.2020, 01:26   #1
Егор28г
Пользователь
 
Регистрация: 21.05.2019
Сообщений: 25
По умолчанию 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, но я не знаю как это сделать.
Егор28г вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лабораторная работа(очень простая) Структуры, работа с файлами yurda Фриланс 2 11.06.2016 09:44
Работа с файлами в С++ Дизель Помощь студентам 7 24.10.2014 19:07
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами Konlor Общие вопросы C/C++ 2 18.05.2014 12:37
Работа с файлами NightFire Паскаль, Turbo Pascal, PascalABC.NET 5 17.05.2009 21:47


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS