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

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

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

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Вот появился тупик, есть базовый класс и производные классы
Кликните здесь для просмотра всего текста
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.06.2013, 03:23
Ответы с готовыми решениями:

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

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

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

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

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

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

По хорошему класс 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
есть несколько способов, но все же советую просто перебросить st1,st2 в базовый класс, несмотря на то, что не во всех производных классах они будут использоваться.
почитайте вот здесь
думаю узнаете много полезного
1
 Аватар для henecs
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
27.06.2013, 14:32  [ТС]
получился рабочий быдло код....

Кликните здесь для просмотра всего текста
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
за раз
C++
1
fwrite(&tmp->fi, sizeof(Figure),1, F) ;
читать аналогично
1
 Аватар для henecs
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
28.06.2013, 13:24  [ТС]
@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
полагаю так:
C++
1
2
3
4
Figure tmpf;
fread(&tmpf,sizeof(Figure),1,F);
int x0= tmpf->getX();
//... и т.д.
0
 Аватар для henecs
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
28.06.2013, 13:42  [ТС]
Цитата Сообщение от henecs Посмотреть сообщение
Figure(){};
* * * * ~Figure(){};
* * * * virtual void paint()=0;
но если я правильно понял то не можно создавать объекты класса в котором есть чисто виртуальная функция .... или можно ? (я в тупике..)
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
28.06.2013, 13:49
а, вон про что разговор, я как-то просмотрел.
можно сделать какой-нибудь отдельный производный класс с полным джентльменским набором, именно для этих целей.
1
 Аватар для henecs
18 / 18 / 11
Регистрация: 19.05.2013
Сообщений: 135
28.06.2013, 13:59  [ТС]
@AntonChik, хмм... как вариант, спасибо за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.06.2013, 13:59
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru