Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Bretbas
Каждому свое
348 / 118 / 31
Регистрация: 05.08.2013
Сообщений: 1,244
Завершенные тесты: 1
#1

Ошибка сохранения/загрузки объекта с файла - C++

25.05.2014, 22:17. Просмотров 338. Ответов 4
Метки нет (Все метки)

Привет всем. Столкнулся с проблемой сохранения/загрузки объекта в/из файла. Вытащил из моего проекта куски кода, и создал новый проект, чтобы легче было показать где именно траблы.

Итак, сейчас я расскажу как все у меня работает:

У меня есть 3 абстрактных класса - Model,View,Controller.

Model - это сущность данных, является субъектом. За любые изменения в Model следят объекты(наблюдатели) класса View. Подписаться на наблюдение можно с помощью метода add_observer(View*).
View - является классом, объекты(наблюдатели) которого, следят за изменениями в Model.
Controller - является классом определяющий виртуальную функцию execute() для переопределения в классах-потомках.(шаблон Command)

Ну собственно стандартный каркас MVC.

Теперь сама задача. Есть еще 3 класса - ModelMap,ViewMap,ControllerMap.

ModelMap - потомок класса Model. Создает сущность о карте. Имеет такие данные как Ширина, Высота и Двумерный массив.
ViewMap - потомок класса View. Любые изменения в ModelMap возвещают ViewMap на отображение карты.
ControllerMap - потомок класса Controller. Переопределяет функцию execute() своего родителя, и по ее вызову намеренно вызывает отображение карты класса ViewMap.

Ну вроде все работает, и я могу видеть карту на своем экране вот таким образом:

C++
1
2
3
4
5
6
...
ModelMap*       model_map           =   new ModelMap(10,10);
ViewMap*        view_map            =   new ViewMap(model_map);
ControllerMap*  controller_map      =   new ControllerMap(model_map);
                controller_map      ->  execute();
...
Но вопрос возник в другом. Как мне сохранять и загружать карту с файла? Я решил сохранять и загружать только модель карты, а вид и контроллер инициализировать после. Но выходит какая-то ошибка при загрузки. Вот мой файл Main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
 
#include "ControllerMap.h"
#include "ModelMap.h"
#include "ViewMap.h"
 
using namespace std;
 
 
ModelMap*       model_map;
ViewMap*        view_map;
ControllerMap*  controller_map;
 
void load()
{
    std :: fstream f_;
    f_.open(L"FILE.BAT",std :: ios :: in | std :: ios :: binary);
    model_map       =   new ModelMap(10,10);
    f_.read(reinterpret_cast<char*>(model_map),sizeof(ModelMap));   
    f_.close();
 
    view_map        =   new ViewMap(model_map);
    controller_map  =   new ControllerMap(model_map);
 
}
 
 
void save()
{
 
    std :: fstream f_;
    f_.open(L"FILE.BAT",std :: ios :: out | std :: ios :: binary);
    f_.write(reinterpret_cast<char*>(model_map),sizeof(ModelMap));
    f_.close();
}
 
 
 
int main()
{
    model_map       =   new ModelMap(10,10);
    view_map        =   new ViewMap(model_map);
    controller_map  =   new ControllerMap(model_map);
 
    controller_map -> execute();
    getch();
 
    char q;
    cout << "s - save; l - load";
    cin >> q;
 
    switch(q)
    {
    case 's': { save(); cout << "saved"; } break;
    case 'l': { load(); controller_map -> execute(); } break;
    }
 
    getch();
 
    return 0;
}
Функцией save() я сохраняю мою модель карты. И все здорово сохраняется.
Функцией load() я пытаюсь загружать мою карту, но выходит ошибка на строке инициализации вида(view_map = new ViewMap(model_map) после загрузки, хотя при отладке все данные, такие как Ширина, Высота и тд считываются с файла.

В чем проблема может быть? У меня были мысли что это из-за того, что при сохранении карты, сохраняется так же и вектор наблюдателей, который находится в классе родителе Model. А если сохранять вектор указателей, то кроме как сериализация ничего больше не поможет на сколько я знаю.
Так как же быть? Я пробовал перед сохранением карты удалять вид(delete view_map), чтобы уничтожить вектор в Model... но ничего не помогает.

Помогите пожалуйста. Как обойти все это? Как сохранить и загрузить карту в моем проекте?

Добавлено через 9 минут
блин,забыл сам проект выложить,тогда только завтра(
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2014, 22:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка сохранения/загрузки объекта с файла (C++):

не работает ф-я сохранения и загрузки - C++
#include&lt;iostream&gt; #include&lt;conio.h&gt; #include&lt;stdio.h&gt; #include&lt;dos.h&gt; using namespace std; struct list { int data; ...

Ошибка при попытке загрузки файла - C++
Задача состоит в том, чтобы по очереди загрузить файлы, введя их имена в консоль. #include &lt;fstream&gt; #include &lt;iostream&gt; using...

скажите пожалуйста код сохранения и загрузки каталога - C++
у меня есть к примеру эрэй int age = {17,24,45}; мне ктото посоветовал ofstream file; file.open(&quot;путь&quot;); file &lt;&lt; ***; ...

Изменить тип сохранения файла - C++
У меня есть генератор паролей,он ниже.При запуске и окончании создании,он сохраняет файл.Но этот файл типа: file ,а мне надо чтобы...

Метод сохранения истории файла - C++
Можете сказать, как хранить историю файла в файле? (как работает Time Mashine). Хочу сделать такой формат файла, который в себе будет...

Единовременное указание пути сохранения txt-файла - C++
Всем привет. Написал программу, которая берёт файлы из определённой папки, обрабатывает их, и потом в эту же папку сохраняет ещё...

4
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.05.2014, 00:25 #2
эээ...незя так сохранять.
надо сохранять/загружать только данные, а не объекты. либо использовать библиотеки для сериализации - boost::serialization например
0
Bretbas
Каждому свое
348 / 118 / 31
Регистрация: 05.08.2013
Сообщений: 1,244
Завершенные тесты: 1
26.05.2014, 00:57  [ТС] #3
почему нельзя сохранять?к примеру есть объект с данными int,char,bool. рази я не смогу его сохранить?у меня сохранялось так
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.05.2014, 01:03 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Bretbas Посмотреть сообщение
к примеру есть объект с данными int,char,bool. рази я не смогу его сохранить?
это данные, их можно сохранить, но как только появляется наследование и виртуальные функции класс перестает быть просто данными и потому такое сохранение не канает
0
Bretbas
Каждому свое
348 / 118 / 31
Регистрация: 05.08.2013
Сообщений: 1,244
Завершенные тесты: 1
27.05.2014, 01:17  [ТС] #5
спасибо)сделано)
0
27.05.2014, 01:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2014, 01:17
Привет! Вот еще темы с ответами:

CDocument::OnSaveDocument указать фильтр для диалогового окна сохранения файла - C++
Добрый день Создал класс наследуемый от CDocument и в нем переопределяется виртуальная функция OnSaveDocument. Пробовал трассировать, она...

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

Прогресс загрузки файла с URLDownloadToFile - C++
Странно, не нашел такой темы. Вопрос такой: как можно от функции URLDownloadToFile получить процент загрузки файла? Знаю, что как-то через...

Ошибка загрузки сэмплов из WAV - C++
Здравствуйте, извиняюсь сразу,миллион раз обсуждали эту проблему,но поиск мне не помог ее решить. у меня программа загружает wav файл и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru