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

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

27.06.2013, 03:23. Показов 1986. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru