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

Вывод в файл и последующее чтение из файла объектов класса - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Цикл: вычислить значение выражения по заданной формуле http://www.cyberforum.ru/cpp-beginners/thread565075.html
Написать программу, в которой используется три вида операторов цикла для вычисления: вот она...помогите кто-нибудь... у меня ответ выдаёт немного неправильный#include <stdio.h> #include <conio.h> #include <math.h> void main () { int i=0, n;
C++ win API:найти информацию о логических дисках. Определить типы логических дисков, обьём диска, колличество секторов в клястере, тип драйвера. http://www.cyberforum.ru/cpp-beginners/thread565070.html
Ищу простую и документированную библиотеку для рисования простых(2D, линейных) графиков C++
Собственно весь вопрос в название темы. Ищу простую и документированную библиотеку для рисования простых(2D, линейных) графиков, желательно чтобы можно было без лишних проблем подключить к проекту в VS. Такие вообще есть? Собственные поиски и неудачи кидают в пучины отчаяния, ибо ничего даже похожего на график скорости в том-же µTorrent'е найдено не было... Прошу помощи!
Вычисление сумм С++ C++
для заданного натурального n рассчитать сумму S=cos1-cos2+cos3-...+(-1)^n+1cosn заранее спасибо
C++ Утечка памяти (Expression: _CrtIsValidHeapPointer(pUserData)) http://www.cyberforum.ru/cpp-beginners/thread565050.html
Добрый вечер всем. Столкнулся с такой проблемой. Запускаю программу, открываеться пустая консоль, увеличиваеться употребление оперативной памяти для программы и викидает такую ошибку: Вот код проекта: .h #pragma once class HeatingSystem { public:
C++ Дано целое число в диапазоне 10–40 Дано целое число в диапазоне 10–40, определяющее количество учебных заданий по некоторой теме. Вывести строку-описание указанного количества заданий, обеспечив правильное согласование числа со словами «учебное задание», например: 18 — «восемнадцать учебных заданий», 23 — «двадцать три учебных задания», 31 — «тридцать одно учебное задание». подробнее

Показать сообщение отдельно
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
05.05.2012, 11:56  [ТС]     Вывод в файл и последующее чтение из файла объектов класса
ForEveR, ну я понял что вот в xml так не напишешь. Ну а вообще как написать вывод в файл чтобы это не получилось быдлокодом. Вот это плохой вариант:

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
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <list>
using namespace std;
 
class A
{
public:
    A(int _x)
    :x(_x){}
 
    virtual void fun()
    {
        cout<<x<<"\t";
    }
 
    virtual void serialize (ofstream& file)
    {
        file<<x<<' ';
    }
 
private:
    int x;
};
 
class B: public A
{
public:
    B(int _x, int _y)
    :A(_x), y(_y){}
 
    virtual void fun()
    {
        cout<<"B"<<"\t";
        A::fun();
        cout<<y<<endl;
    }
 
    virtual void serialize(ofstream& file)
    {
        A::serialize(file);
        file<<y<<' ';
    }
 
private:
    int y;
};
 
class C: public A
{
public:
    C(int _x, char _c)
    :A(_x), c(_c){}
 
    virtual void fun()
    {
        cout<<"C"<<"\t";
        A::fun();
        cout<<c<<endl;
    }
 
    virtual void serialize(ofstream& file)
    {
        A::serialize(file);
        file<<c<<' ';
    }
 
private:
    char c;
};
 
 
bool writeToFile(list<A*>& x, ofstream& file)
{
    file.clear();
 
    list<A*>::iterator it= x.begin();
    while(it!= x.end() && file.good())
    {
        if(dynamic_cast<C*> (*it))
         file<<"C";
        else if(dynamic_cast<B*> (*it))
         file<<"B";
        else
         file<<"A";
 
        file<<" ";
        (*it++)->serialize(file);
    }
 
    return (file.good() ? true: false);
}
 
 
int main()
{
    A a(1);
    B b(2,2);
    C c(3,'c');
 
    ofstream outFile("file.xml");
 
    list<A*> simpleList;
    list<A*>::iterator it;
    simpleList.push_back(&b);
    simpleList.push_back(&c);
    simpleList.push_back(&a);
 
    writeToFile(simpleList,outFile);
}
?
Скажте если что некрасиво или если вообще идея плохая. Предположительно будет задание написать что-то на наследование и на вывод в файл за часок (на листке), думаю полноценная сериализация как это в MFC или у буста на это время не рассчитывается, рассчитывать будут на что попроще (если вообще такое задание дадут конечно).

Добавлено через 1 минуту
*чтение дописываю просто, спешу показать как я вывожу в файл. Чтение реализовать планирую подобно:
читаю первый символ, switch (символ) case A - читаю как А, case B - читаю как B. Ну вы поняли идею.
Другое дело если скажут " а если у нас тут char* есть поле в классе и мы не знаем его длину и там могут быть переводы строки, а ещё там могут быть скобки (") что тогда, а? Съел, а , съел?"

Добавлено через 17 минут
Дописал чтение из файла, но почему то с тестовыми данными вижу через дебагер что А последнюю (или если последнее что-то другое то это другое) два раза читает, любопытно как это получается оно так...
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
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <list>
using namespace std;
 
class A
{
public:
    A(int _x)
    :x(_x){}
 
    virtual void fun()
    {
        cout<<x<<"\t";
    }
 
    virtual void serialize (ofstream& file)
    {
        file<<x<<' ';
    }
 
private:
    int x;
};
 
class B: public A
{
public:
    B(int _x, int _y)
    :A(_x), y(_y){}
 
    virtual void fun()
    {
        cout<<"B"<<"\t";
        A::fun();
        cout<<y<<endl;
    }
 
    virtual void serialize(ofstream& file)
    {
        A::serialize(file);
        file<<y<<' ';
    }
 
private:
    int y;
};
 
class C: public A
{
public:
    C(int _x, char _c)
    :A(_x), c(_c){}
 
    virtual void fun()
    {
        cout<<"C"<<"\t";
        A::fun();
        cout<<c<<endl;
    }
 
    virtual void serialize(ofstream& file)
    {
        A::serialize(file);
        file<<c<<' ';
    }
 
private:
    char c;
};
 
 
bool writeToFile(list<A*>& x, ofstream& file)
{
    file.clear();
 
    list<A*>::iterator it= x.begin();
    while(it!= x.end() && file.good())
    {
        if(dynamic_cast<C*> (*it))
         file<<"C";
        else if(dynamic_cast<B*> (*it))
         file<<"B";
        else
         file<<"A";
 
        file<<" ";
        (*it++)->serialize(file);
    }
 
    return (file.good() ? true: false);
}
 
list<A*>* readFromFile(ifstream& file)
{
    file.clear();
    list<A*>* result=new list<A*>;
 
    char ch;
    int x,y;
 
    while(!file.eof() && file.good())
    {
        file>>ch;
        switch(ch)
        {
            case 'A':
            file>>x;
            result->push_back(new A(x));
            break;
 
            case 'B':
            file>>x>>y;
            result->push_back(new B(x,y));
            break;
 
            case 'C':
            file>>x>>ch;
            result->push_back(new C(x,ch));
            break;
 
            default:
            break;
        }
        file.ignore();
    }
    return result;
}
 
 
int main()
{
    A a(1);
    B b(2,2);
    C c(3,'c');
 
    ofstream outFile("file.xml");
 
    list<A*> simpleList;
    list<A*>::iterator it;
    simpleList.push_back(&b);
    simpleList.push_back(&c);
    simpleList.push_back(&a);
 
    writeToFile(simpleList,outFile);
 
    outFile.close();
 
    ifstream inFile("file.xml");
    list<A*>* resultOfReading= readFromFile(inFile);
 
 
    it= resultOfReading->begin();
    while(it!=resultOfReading->end())
    {
        (*it++)->fun();
    }
}
Комментарии не пишу, названия функций говорят сами за себя.

Добавлено через 21 час 29 минут
Ходил вчера на собеседование, задание и правда было такое что нужно написать класс, наследников, а потом вывести в файл и считать из файла. Написал реализацию подобную той что в этой теме, посмотрим что скажут.
 
Текущее время: 03:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru