Форум программистов, компьютерный форум CyberForum.ru

Запись и чтение объектов разных классов в один файл - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Не запускает программу после компиляции http://www.cyberforum.ru/cpp-beginners/thread638886.html
Дело в том что когда проверяю код на ошибки всё нормально, но когда нажимаю "запустить" мне выдает что его нужно сначала откомпеллировать. Лазила в настройках, устанавливала разные среды, везде одна и таже ошибка. У меня еще такой вопрос: влияет ли ОС на это? Дело в том что когда у меня стояла лицензия таких ошибок не было, но после переустановки на пиратскую винду (хр) у меня возникли эти...
C++ Код Enter Как мне прописать условие: если нажата кнопка enter http://www.cyberforum.ru/cpp-beginners/thread638867.html
C++ Хранение глобального массива с объектами
Добрый день всем. У меня есть vector с объектами. И надо чтобы он был доступен по всех классах.( отдельных файлах ). Чтобы я мог менять его значения по ссылке. Как лучше реализовать такое хранилище? В виде глобальной переменной - говорят плохо. Заранее спасибо!
C++ таймер c++
Всем привет. Прошу вас помочь мне в слудующем: нужен простой таймер(среда visual c++ express выпуск),который отключит вот эту функцию через 20 секунд после включения Сама функция: if(opt.other.аст==1) {MEMwrite((void *)(ast),(void *)"\xC3",1);} if(opt.other.аст==0) {MEMwrite((void *)(ast),(void *)"\x55",1);}
C++ Действие при нажатии Enter http://www.cyberforum.ru/cpp-beginners/thread638840.html
Вот недавно здесь нашел код: #include "stdafx.h" #include <conio.h> #include <string> #include <fstream> #include "iostream" #include <windows.h> using namespace std;
C++ Как создать механические часы (с циферблатом и стрелками) Всем привет) Мне в универе задали написать мех. часы, но как я поняла, они создаются при помощи классов... Меня это удивило, потому что нам говорили, что мы только на след. год будем работать с классами... Скажите, можно ли их создать без классов?) подробнее

Показать сообщение отдельно
moskitos80
 Аватар для moskitos80
39 / 39 / 0
Регистрация: 04.10.2011
Сообщений: 128
17.08.2012, 14:01     Запись и чтение объектов разных классов в один файл
Здравствуйте. Изучаю С++ по Лафоре. Дошёл до места, где объясняется, как записывать объекты разных классов в один бинарник.

У Лафоре, идея чтения из одного файла, данных объектов разных классов, следующая: перед записью данных объекта записываем его тип (в приведённом листинге типы содержит перечисление Ctypes), а при чтении - сначала читаем тип, создаём объект нужного класса и читаем в него данные.

Почитал тему - понял - начал делать: облом, прога вылетает с ошибкой сегментации памяти. В чём дело не могу понять - хоть убейте! Который день ломаю голову сегодня дошёл до того, что решил делать дампы памяти (сам я PHP - шник для меня это дело новое - дикое )

Описание проблемы следующее - есть Базовый класс: Person с парой полей (чисто для того, что бы было, что в файл записывать), и есть 2 его наследника: Student и Employee тоже со своими полями (что бы в бинарнике их байты хоть как то различались), а так же есть класс Storage, который должен их сохранять и читать из файла. Так вот, если прога отрабатывает одним запуском, т.е. пишет в файл, а потом сразу читает - всё ок! НО, если я сначала пишу в файл (комментирую строку storage.readAll(); ) а потом только читаю из файла (комментирую логику записи) то прога вылетает с ошибкой сегментации.

При этом я заметил, когда в методе storage.readAll() - инициализируется нужный обект он имеет отличающийся набор байтов от того, который в него считыватся из файла. При этом отличается только первый байт данных объекта! И почему-то всегда на 20(HEX)! Повторюсь, что при запуске программы на чтение и на запись данные при инициализации и те, что в файле абсолютно идентичны. Люди знает кто нибудь что это за фича? Подскажите чайнику.

Листинг:

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <iostream>
#include <fstream>
#include <typeinfo>
 
using namespace std;
 
const int MAX_PERS = 4;
const char* PERS_FILE_NAME = "PERS_DATA.ART";
 
// Типы данных объектов:
enum Ctypes {
    Tstudent,
    Temployee
};
 
/////////////////////////////////////////////////////////////////////////////////
class Person
{
    public :
        Person() {
            this->age = 500;
        }
        virtual void getData(void)
        {
            cout  << endl << "Age  " << this->age  << endl;
        }
    protected :
        int age;
};
/////////////////////////////////////////////////////////////////////////////////
class Student : public Person
{
    public :
        Student() : Person(), gpa (13.6), course (8) {}
 
        void getData(void)
        {
            cout << endl << "---------- Student data: ----------" << endl;
            Person::getData();
            cout << endl << "GPA "     << this->gpa
                 << endl << "Course  " << this->course  << endl;
        }
    protected :
        float gpa;
        int course;
};
/////////////////////////////////////////////////////////////////////////////////
class Employee : public Person
{
    public :
        Employee() : Person(), post (555) {}
 
        void getData(void)
        {
            cout << endl << "---------- Employee data: ----------" << endl;
            Person::getData();
            cout << endl << "Post "     << this->post << endl;
        }
    protected :
        int post;
};
/////////////////////////////////////////////////////////////////////////////////
class Storage
{
    public :
        bool store(Person** pers1, int cnt)
        {
            Ctypes type;
            int size = 0;
 
            ofstream outf(PERS_FILE_NAME, ios::binary|ios::app);
            if (!outf) {cerr << endl << "Err open!"; return false;}
 
            for(int i = 0; i < cnt; i++) {
 
                type = this->getType(pers1[i]);
                outf.write((char*)&type, sizeof(type));
                if (!outf) {cerr << endl << "Err write type!"; return false;}
 
                if (type == Tstudent) {
                    size = sizeof(Student);
                } else {
                    size = sizeof(Employee);
                }
 
                outf.write((char*)pers1[i], size);
                if (!outf) {cerr << endl << "Err write type!"; return false;}
            }
            return true;
        }
 
        bool readAll()
        {
            Person* pers1[MAX_PERS];
 
            int size = 0, cnt = 0;
            Ctypes type;
 
            ifstream inf(PERS_FILE_NAME, ios::binary);
            if (!inf) {cerr << endl << "Err open!"; return false;}
 
            while (1) {
                inf.read((char*)&type, sizeof(type));
                if(inf.eof()) {break;}
 
                if (type == Tstudent) {
                    // Инициализация 
                    pers1[cnt] = new Student; // дамп: 28 2c 47 00 f4 01 00 00|9a 99 59 41 08 00 00 00
                    size = sizeof(Student);
                } else {
                    // Инициализация 
                    pers1[cnt] = new Employee; 
                    size = sizeof(Employee);
                }
                // Считывается из файла: 48 2c 47 00 f4 01 00 00|9a 99 59 41 08 00 00 00
                inf.read((char*)pers1[cnt], size); 
                if (!inf) {cerr << endl << "Err read type!"; return false;}
                pers1[cnt++]->getData();
            }
            return true;
        }
 
        Ctypes getType(Person* person)
        {
            if (typeid(*person) == typeid(Student)) {
                return Tstudent;
            }
            return Temployee;
        }
};
/////////////////////////////////////////////////////////////////////////////////
 
int main()
{
    Storage storage;
    Person* pers[MAX_PERS];
 
    // Инициализируем массив
    for (int i = 0; i < MAX_PERS; i++) {
        pers[i] = NULL;
    }
    // Тупо ручками:
    pers[0] = new Student;
    pers[1] = new Student;
    pers[2] = new Employee;
    pers[3] = new Employee;
 
    // Пишем
    if (storage.store(pers, MAX_PERS)) {
        cout << endl << "STORED OK" << endl;
    }
    // Читаем
    storage.readAll();
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 15:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru