Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
1

Запись класса в файл

27.06.2013, 03:23. Показов 1636. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Вот появился тупик, есть базовый класс и производные классы
Кликните здесь для просмотра всего текста
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
class Figure{
   protected:
        int x,y;
        TColor color;
        int size;
        int type;
   public:
        Figure(){};
        ~Figure(){};
        virtual void paint()=0;
 
        int getX(){return x;}
        int getY(){return y;}
        int getColor(){return color;}
        int getSize(){return size;}
        int getType(){return type;}
 
        void setX(int nX){x=nX;}
        void setY(int nY){y=nY;}
        void setColor(int nColor){color = nColor;}
        void setSize(int nSize) {size = nSize;}
        void setType(int nType) {type = nType;}
 
};
class FSquare: public Figure
{
        public:
        void paint();
        FSquare(int nx, int ny, int nc, int ns)
        {x=nx; y=ny; color = nc; size = ns;}
};
class FRectangle: public Figure
   {
        int st1,st2;
        public:
        void paint();
        FRectangle(int nx, int ny, int nc, int ns, int nst1, int nst2)
        {x=nx; y=ny; color = nc; size = ns; st1 = nst1; st2 = nst2;}
};
class FRhombus: public Figure{
        public:
        void paint();
        FRhombus(int nx, int ny, int nc, int ns)
        {x=nx; y=ny; color = nc; size = ns;}
};
class FEllipse: public Figure
   {
        int st1,st2;
        public:
        void paint();
        FEllipse(int nx, int ny,int nc,int ns, int nst1, int nst2)
        {x=nx; y=ny; color = nc; size = ns; st1 = nst1; st2 = nst2;}
};

ну и список указателей на базовый класс
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
struct List
   {
      Figure *fi;
      List *next;
   };

заполняю список так :
Кликните здесь для просмотра всего текста
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
 switch (fType)
    {
       case square:
       {  FSquare *f= new FSquare(X,Y,fColor,fSize);
            add_to(T,f);
          break;
       }
       case rectangle:
       {  FRectangle *f = new FRectangle (X,Y,fColor,fSize,fst1,fst2);
            add_to(T,f);
          break;
       }
       case fellipse:
       {
          FEllipse *f = new FEllipse(X,Y,fColor,fSize, fst1, fst2);
            add_to(T,f);
          break;
       }
      default:
      {
        FRhombus *f = new FRhombus(X,Y,fColor,fSize);
         add_to(T,f);
      }
      }
//------------------
void __fastcall  add_to(List *&T, Figure *f)
   {
      List *tmp = new List;
      tmp->fi = f;
      tmp->next = NULL;
      if (!T)
         T=tmp;
      else
         {
            List *l=T;
            while (l->next)
               l=l->next;
            l->next=tmp;
 
         }
      return ;
 
   };

вот собственно вопрос, как бы ЭТО лучше записать в файл?
мне в голову что то умное не лезет...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2013, 03:23
Ответы с готовыми решениями:

Запись класса в файл
Приветствую. Я хочу записать битовую форму класса, но столкнулся с делемой. Насколько мне...

Запись класса в двоичный файл
Добрый день дорогие друзья. никак не могу осуществить запись\чтение класса в двоичный файл. в...

Запись объекта класса в файл
Здравствуйте, может кто-нибудь помочь с данным вопросом? Как мне записать в файл строку, которая...

Запись экземпляра класса в файл
есть класс _matrix.Я выполняю некии действия с объектом этого класса,а потом записываю этот объект...

15
39 / 39 / 24
Регистрация: 13.05.2010
Сообщений: 282
Записей в блоге: 1
27.06.2013, 03:30 2
Я так понял, вас интересует структура файла, который будет содержать информацию о фигурах, да?
0
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
27.06.2013, 03:34  [ТС] 3
@Khelleos, да, вот весь код создания фигур, и это надо как то в файл записать
0
39 / 39 / 24
Регистрация: 13.05.2010
Сообщений: 282
Записей в блоге: 1
27.06.2013, 03:51 4
Как вариант следующий формат:
<тип фигуры> <x> <y> <color> <size>

Или вам нужна конкретно реализация?

Добавлено через 9 минут
Наследуемые классы вызывают конструктор класса Figure?
Вроде бы надо делать следующим образом:
C++
1
FSquare(int x, int y, TColor color, int size):Figure(0, x, y, color, size)
Ну и собственно конструктор для класса Figure.
C++
1
2
3
4
5
6
7
8
Figure(int _type, int _x, int _y, TColor _color, int _size) 
{
   type = _type;
   x = _x;
   y = _y;
   color = _color;
   size = _size;
}
0
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
27.06.2013, 06:42  [ТС] 5
Цитата Сообщение от Khelleos Посмотреть сообщение
Как вариант следующий формат:
<тип фигуры> <x> <y> <color> <size>
я тоже так думал если бы не было у фигуры эллипс дополнительных 2х параметров

конструкторы работают хорошо
0
39 / 39 / 24
Регистрация: 13.05.2010
Сообщений: 282
Записей в блоге: 1
27.06.2013, 06:49 6
Проверяете тип фигуры и дальше пишите то что надо.
Для эллипса будет так:
<тип фигуры> <x> <y> <color> <size> <st1> <st2>
Для других так:
<тип фигуры> <x> <y> <color> <size>

Когда будете считывать данные с файла, считайте сначала <type> и в зависимости от фигуры считаете оставшиеся данные в строке файла.
1
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
27.06.2013, 07:00  [ТС] 7
@Khelleos,еще 1 вопрос
у меня есть список, в котом указатели на базовый класс, как мне через указатель на базовый класс вытянуть <st1> <st2> из производных классов?
0
39 / 39 / 24
Регистрация: 13.05.2010
Сообщений: 282
Записей в блоге: 1
27.06.2013, 07:32 8
Думаю нельзя так.

По хорошему класс Figure сделать абстрактным(базовым, т.к. он содержит общие черты фигур. Один из инструментов ООП) и сделать шаблон для списка
C++
1
2
3
4
template <class T> struct LIST {
    T value;
    LIST *next;
};
И объявить отдельные списки для каждой фигуры. Пример
C++
1
LIST<FEllipse> listEllipse;
И дописать методы для класса FEllipse, через которые можно будет получить или установить значения st1 и st2.
1
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
27.06.2013, 07:32 9
есть несколько способов, но все же советую просто перебросить st1,st2 в базовый класс, несмотря на то, что не во всех производных классах они будут использоваться.
почитайте вот здесь
думаю узнаете много полезного
1
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
27.06.2013, 14:32  [ТС] 10
получился рабочий быдло код....

Кликните здесь для просмотра всего текста
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
void __fastcall f_write(List *T, FILE *&F)
   {
      List *tmp = T;
      while (tmp)
         {
            int ft=tmp->fi->getType();
            fwrite(&ft, sizeof(int),1, F ) ;
            int x0=tmp->fi->getX();
            fwrite(&x0, sizeof(int) ,1 ,F);
            int y0=tmp->fi->getY();
            fwrite(&y0, sizeof(int), 1, F);
            int col=tmp->fi->getColor();
            fwrite(&col, sizeof(int), 1, F);
            int siz=tmp->fi->getSize();
            fwrite(&siz, sizeof(int), 1, F);
            int s1=tmp->fi->getSt1();
            fwrite(&s1, sizeof(int), 1, F);
            int s2=tmp->fi->getSt2();
            fwrite(&s2, sizeof(int), 1, F);
            tmp=tmp->next;
         }
 
   };
 
void __fastcall f_read(List *&T, AnsiString str)
   {
      FILE *F=fopen(str.c_str(), "r");
      while (!feof(F))
         {
            int ft;
            fread(&ft,sizeof(int),1,F);
            int x0;
            fread(&x0, sizeof(int) ,1 ,F);
            int y0;
            fread(&y0, sizeof(int), 1, F);
            int col;
            fread(&col, sizeof(int), 1, F);
            int siz;
            fread(&siz, sizeof(int), 1, F);
            int s1;
            fread(&s1, sizeof(int), 1, F);
            int s2;
            fread(&s2, sizeof(int), 1, F);
 
      switch (ft)
    {
       case square:
       {  FSquare *f= new FSquare(x0,y0,col,siz);
            add_to(T,f);
          break;
       }
       case rectangle:
       {  FRectangle *f = new FRectangle (x0,y0,col,siz,s1,s2);
            add_to(T,f);
          break;
       }
       case fellipse:
       {
          FEllipse *f = new FEllipse(x0,y0,col,siz, s1, s2);
            add_to(T,f);
          break;
       }
      default:
       {
        FRhombus *f = new FRhombus(x0,y0,col,siz);
         add_to(T,f);
       }
      }
    }
         paint_l(T);
       fclose(F);
   };

может это быдло код можно как то переписать?
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
28.06.2013, 06:03 11
за раз
C++
1
fwrite(&tmp->fi, sizeof(Figure),1, F) ;
читать аналогично
1
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
28.06.2013, 13:24  [ТС] 12
@AntonChik, а как тогда мне вызвать конструктор і-й фигуры которую я читаю с файла?
фигуры у меня создаются так :
Кликните здесь для просмотра всего текста
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
      switch (ft) // тип фигруры
      {
       case square:
       {  FSquare *f= new FSquare(x0,y0,col,siz);
            add_to(T,f);
          break;
       }
       case rectangle:
       {  FRectangle *f = new FRectangle (x0,y0,col,siz,s1,s2);
            add_to(T,f);
          break;
       }
       case fellipse:
       {
          FEllipse *f = new FEllipse(x0,y0,col,siz, s1, s2);
            add_to(T,f);
          break;
       }
      default:
       {
        FRhombus *f = new FRhombus(x0,y0,col,siz);
         add_to(T,f);
       }
      }
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
28.06.2013, 13:35 13
полагаю так:
C++
1
2
3
4
Figure tmpf;
fread(&tmpf,sizeof(Figure),1,F);
int x0= tmpf->getX();
//... и т.д.
0
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
28.06.2013, 13:42  [ТС] 14
Цитата Сообщение от henecs Посмотреть сообщение
Figure(){};
* * * * ~Figure(){};
* * * * virtual void paint()=0;
но если я правильно понял то не можно создавать объекты класса в котором есть чисто виртуальная функция .... или можно ? (я в тупике..)
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
28.06.2013, 13:49 15
а, вон про что разговор, я как-то просмотрел.
можно сделать какой-нибудь отдельный производный класс с полным джентльменским набором, именно для этих целей.
1
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
28.06.2013, 13:59  [ТС] 16
@AntonChik, хмм... как вариант, спасибо за помощь
0
28.06.2013, 13:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2013, 13:59
Помогаю со студенческими работами здесь

Запись в файл объекта класса
class Object { private: int myN; std::vector&lt;std::string&gt; myLines; public: ...

Запись объекта класса в файл
Доброго времени суток! нужно сохранить объект вот такого класса: class Act { public: ...

Запись класса в bin файл
Есть класс, одно поле должно быть текстовое, в моем классе model. Данные беруться из StringGrid,...

Запись в файл объекта класса
Добрый вечер,предположим есть подобный класс,с полями : const SIZE = 10; class myClass { ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru