Форум программистов, компьютерный форум 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++ Как создать механические часы (с циферблатом и стрелками) Всем привет) Мне в универе задали написать мех. часы, но как я поняла, они создаются при помощи классов... Меня это удивило, потому что нам говорили, что мы только на след. год будем работать с классами... Скажите, можно ли их создать без классов?) подробнее

Показать сообщение отдельно
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2012, 12:26     Запись и чтение объектов разных классов в один файл
Так можно:
Код
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#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.6f), 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;
            int n = 0; // количество объектов, в файле.
            
            fstream f(PERS_FILE_NAME, ios::in | ios::out | ios::binary | ios::ate);
            
            if (!f.is_open()) // если файл не существует.
            {
                f.clear();
                ofstream outf(PERS_FILE_NAME, ios::out | ios::binary);
                outf.write((const char*)&n, sizeof(n)); // 0 объектов в файле.
                outf.close();
                f.open(PERS_FILE_NAME, ios::in | ios::out | ios::binary | ios::ate);
            }
            // запись в конец файла.
            for(int i = 0; i < cnt; i++) 
            {
 
                type = this->getType(pers1[i]);
              
                f.write((char*)&type, sizeof(type)); // записываем тип объекта.
                if (!f) 
                {
                    cerr << endl << "Err write type!"; 
                    return false;
                }
                
                if (type == Tstudent) 
                {
                    size = sizeof(Student);
                } 
                else 
                {
                    size = sizeof(Employee);
                }
 
                f.write((char*)pers1[i], size); // записываем объект.
                if (!f) 
                {
                    cerr << endl << "Err write type!"; 
                    return false;
                }
            } //for
            
            f.close();
            
            // открываем файл для перезаписи количества объектов в файле.
            f.open(PERS_FILE_NAME, ios::in | ios::out | ios::binary);
            f.read((char*)&n, sizeof(n)); // считываем старое значение.
            n = n + cnt; // новое количество объектов в файле.
            f.seekp(0); // курсор в начало.
            f.write((const char*)&n, sizeof(n)); // записываем новое значение.      
            
            return true;
        }
 
     //....................................................................
        bool readAll()
        {
            ifstream inf(PERS_FILE_NAME, ios::in | ios::binary);
            if (!inf) 
            {
                cerr << endl << "Err open!"; 
                return false;
            }
            
            int n = 0; // количество объектов  в файле.
            
            inf.read((char*)&n, sizeof(n)); // считываем количество объектов.
            if (!inf) 
            {
                cerr << endl << "Err read type!"; 
                return false;
            }
            
            Person **pers1 = new Person*[n];
            
            int size = 0, cnt = 0;
            Ctypes type;
 
            while (cnt < n) 
            {
                inf.read((char*)&type, sizeof(type)); // считываем тип объекта.
                if (!inf) 
                {
                    cerr << endl << "Err read type!"; 
                    return false;
                }
                
                if (type == Tstudent) 
                {
                    // Инициализация
                    pers1[cnt] = new Student; 
                    size = sizeof(Student);
                } 
                else 
                {
                    // Инициализация
                    pers1[cnt] = new Employee;
                    size = sizeof(Employee);
                }  
                
            //*...выводим на консоль, то что в памяти.  
                    cout << "\nIn memory      ";
                    for (int i = 0; i < size; i++)
                    {
                        cout << hex;
                        cout << (int)(*(((unsigned char*)(pers1[cnt])) + i));
                        cout << " ";
                    }
                    cout << endl;
            //..........................................*/ 
               
               // Считываем из файла.
                inf.ignore(sizeof(Person) / 2); // пропускаем таблицу виртуальных функций.
                
                pers1[cnt] = (Person*)(((char*)(pers1[cnt])) + (sizeof(Person) / 2)); // перемещаем указатель на величину таблицы.
                
                inf.read((char*)pers1[cnt], size - (sizeof(Person) / 2)); // читаем из файла объект без таблицы.
                if (!inf) 
                {
                    cerr << endl << "Err read object!"; 
                    return false;
                }
                
                pers1[cnt] = (Person*)(((char*)(pers1[cnt])) - (sizeof(Person) / 2)); // возвращаем указатель на начало объекта в памяти.
                
            //* выводим на консоль, то что в памяти после считывания из файла. 
                cout << "After reading  ";
                for (int i = 0; i < size; i++)
                {
                    cout << hex;
                    cout << (int)(*(((unsigned char*)(pers1[cnt])) + i));
                    cout << " ";
                }   
                cout << endl;
            //....................................................*/
                cout << dec;
                pers1[cnt] -> getData();
                cnt++;
                }
            
            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();
 
    system("pause");
    return 0;
}
 
Текущее время: 14:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru