Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Сохранение класса на диск  (Прочитано 48333 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 14-09-2005 06:30 » 

Никак не могу придумать как реализовать  Здесь была моя ладья...
Нужно сохранить структуру или класс типа

class DataToSave{
int a;
float b;
CString c;
};

С интом и флоатом все понятно, а вот как быть с CStringом? причем это должен быть обязательно CString а не char[...]
Нужно сохранять весь класс целиком поскольку структура класса мне неизвестна т. е. так делать нельзя

Savea();
Saveb();
Savec();

Как быть?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #1 : 14-09-2005 06:32 » 

а если что то типа дампа памяти в которой хранится экземпляр класса?
Записан

Удачного всем кодинга! -=x[PooH]x=-
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 14-09-2005 06:36 » 

Я об этом думал но нужен размер класса в памяти и sizeof здесь не подходит
Я слышал проблемма както решается с помощью сериализации, никто не в курсе?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-09-2005 06:39 » 

при сохранении строки обычно делают что-то вроде этого: сохраняют сначала ее длину, а затем сохраняют всю строку.

при чтении из файла - обратная последовательность: читаешь длину строки, а затем читаешь указанное количество символов.
Записан
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 14-09-2005 06:40 » 

а что касается CString, то сначала читешь из файла строку, а затем создаешь класс (или просто присваиваешь) CString.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 14-09-2005 06:44 » 

CString str="текстттт";
char *p;
int len;

len=str.GetLength();
p=str.GetBuffer(len);

p - указатель на строку байт
len - длина (НЕ включая символ 0)
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #6 : 14-09-2005 06:45 » 

а что касается CString, то сначала читешь из файла строку, а затем создаешь класс (или просто присваиваешь) CString.
Структура класса мне неизвестна Я не знаю есть ли там CString или нет а может там CRect?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 14-09-2005 06:48 » 

а читать из файла так:
узнаём длину, создаём чар-массив, ДОПИСЫВАЕМ НОЛЬ(а то вылет обеспечен), читаем в него, а затем присваиваем стрингу:

CString str;

//здесь читаем длину
//...-> N

char *p=new char[N+1];
p[N]=0;

//здесь читаем из файла в p[]
//...

//присваиваем
str=p;
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #8 : 14-09-2005 06:51 » 

Алексеееей))) Do you hear me?)
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 14-09-2005 06:52 » 

Я слышал проблемма както решается с помощью сериализации, никто не в курсе?

стандартный механизм сериализации (я говорю о MSVC 6.0, может в 7-ом и по-другому) для CString сохраняет только содержимое строки, то есть сам текст.
а читает - по отдельными  словами. то есть стандартные операции сериализации сохранения/чтения для CString не являются обратными к друг другу.

можно переопределить сериализацию для класса унаследованного от CString. но оно тебе надо?

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

Записан
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 14-09-2005 06:53 » 

а что касается CString, то сначала читешь из файла строку, а затем создаешь класс (или просто присваиваешь) CString.
Структура класса мне неизвестна Я не знаю есть ли там CString или нет а может там CRect?

А, извини. Тогда действительно можно унаследовать класс от CString  и переопределить Serialize.
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #11 : 14-09-2005 07:00 » 

Видишь ли я не знаю есть там CString или нет для меня этот класс как черный ящик
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 14-09-2005 07:07 » 

USBLexus  i hear Улыбаюсь

просто когда я писал твоего поста не было ещё.

Если класс - чёрный ящик, тогда - дрова. Никак ты его, если в него не встроено сохранение. С другой стороны - как в смысте ЧЯ ?

ты знаешь, какие именно свойства надо сохранить - ты их и сохрани, а при загрузке - создай экземпляр класса и залей в него эти свойства
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 14-09-2005 07:08 » 

если ты пишешь этот класс, ты ему встой методу

Сахраницца();
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #14 : 14-09-2005 07:25 » 

ЧЯ в том смысле что я получаю класс на входе шаблонной функции и тип он следовательно может иметь любой Мне его нужносохранить на диск но вот проблема как это сделать... И пишу его не я
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 14-09-2005 07:32 » 

Для тебя какой класс как ЧЯ? DataToSave? или его член CString/CRect/CSomething...?

Если DataToSave, то его разработчик должен позаботиться о механизме сериализации...
А тебе достаточно будет вызвать Serialize.
« Последнее редактирование: 14-09-2005 07:34 от Hooter » Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #16 : 14-09-2005 07:33 » 

Для тебя какой класс как ЧЯ? DataToSave? или его член CString/CRect/CSomething...?
DataToSave
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 14-09-2005 07:34 » 

Если DataToSave, то его разработчик должен позаботиться о механизме сериализации...
А тебе достаточно будет вызвать Serialize.
Записан
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 14-09-2005 07:37 » 

А что вообще тебе известно о DataToSave?
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #19 : 14-09-2005 07:38 » 

Если DataToSave, то его разработчик должен позаботиться о механизме сериализации...
А тебе достаточно будет вызвать Serialize.
Это както неудобно разрабатывать метод для каждого класса в принципе сейчас оно все так и реализовано). Хотелось бы автоматизировать процесс...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #20 : 14-09-2005 07:39 » 

А что вообще тебе известно о DataToSave?
Что это класс))
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 14-09-2005 07:46 » 

А что вообще тебе известно о DataToSave?
Что это класс))

Ну, например, какие нибудь ограничения.. типа на вход твоей шаблонной функции может быть подан только класс унаследованный от CObject.

Или на вход шаблонной функции могут быть поданы только классы только определенного множества типов (например только CDataToSave, COtherDataToSave и CAnotherDataToSvae) ?

Хотя даже в этом случае тебе придется написать проседуру сохранения для каждого класса... Жаль
« Последнее редактирование: 14-09-2005 07:49 от Hooter » Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #22 : 14-09-2005 08:48 » 

USBLexus,

у меня тут есть проект, в котором я гайки кручу Ага. Так вот тут все работает и с CString, но вот каким образом:

class MyClass : public CObject
{
  CString m_Str;
  LONG    m_n1;
....
}

Потом где-то там, где надо сохранять :

void какой_то класс::MyFunc()
{
   CFile*  myFile;

   myFile=new CFile(PathName,CFile::modeRead);

   CArchive ar(myFile,CArchive::load);
   Serialize(ar);

   ar.Close();
   myFile->Close();
   delete myFile;   
}

void какой_то класс::Serialize(CArchive& ar)
{
   MyClass * pObject;

   if(ar.IsStoring())
   {
      pObject = как-то его получаешь;
      ar << pObject;
   }
   else
   {
      // read file
      ar >> pObject;

      pObject->Set_всеПараметры(start_value);
   }
}

Но важно, чтобы класс был наследован от CObject, тогда это работает.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #23 : 14-09-2005 09:52 » 

В самом общем случае - когда о классе ничего не известно и он не "твой" - единственно правильное и чистое решение:
его разработчик должен позаботиться о механизме сериализации...
А тебе достаточно будет вызвать Serialize.

В крайнем случае обяжи разработчика сделать хотябы функцию GetSize(), тогда ты сможешь сохранять кусок памяти.

А иначе задача не имеет решения
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #24 : 14-09-2005 10:22 » 

Malaja,

Спасибо!
Классно, по виду вроде то что надо:)))))))))))))))))))))))
Попробую внедрить как разгребусь немножко %) Отпишу потом что получится!
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #25 : 14-09-2005 10:24 » 


В крайнем случае обяжи разработчика сделать хотябы функцию GetSize(), тогда ты сможешь сохранять кусок памяти.
А иначе задача не имеет решения


Думаю что я могу заставить разработчика класса унаследовать его от CObject Ага
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #26 : 14-09-2005 10:29 » 

USBLexus,

просто если класс гуляет как кошка, т.е. сам по себе, и о нем ничего вообще неизвестно, плюс у него нет никакой реализации для сериализации, то я даже понятия не имею, как это можно сохранить (Джон об этом уже написал).

Приведенный мной пример работает, т.к. проект живет уже долго и даже иногда счастливо Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #27 : 15-09-2005 07:30 » 

Думаю что я могу заставить разработчика класса унаследовать его от CObject Ага

Отличненько! Не забудь его так-же "заставить" Улыбаюсь использовать макросы DECLARE_SERIAL и IMPLEMENT_SERIAL. А то работать не будет.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #28 : 19-09-2005 09:27 » 

Написал тут тестовый проект... чтото я по моему не то  делаю...

Описал класс:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
class StoredClass: public CObject
{
public:
   DECLARE_SERIAL(StoredClass)
   StoredClass(void);
   ~StoredClass(void);
   CString str;
   int      number;
   CRect   rect;
};

IMPLEMENT_SERIAL(StoredClass, CObject, 1)

StoredClass::StoredClass(void):CObject()
{
   str="Constructor";
   number=1;
   rect=CRect(1,1,1,1);
}

StoredClass::~StoredClass(void)
{
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Написал функцию сохранения класса на диск

void CTestSaveDlg::OnBnClickedButton1()
{
   CFile*  myFile;

   myFile=new CFile("1.dat",CFile::modeCreate|CFile::modeWrite);

   CArchive ar(myFile,CArchive::store);
   Serialize(ar);

   ar.Close();
   myFile->Close();
   delete myFile;   
}

где

void CTestSaveDlg::Serialize(CArchive& ar)
{
   if(ar.IsStoring())
   {
      ar << &m_StoredClass;
   }
   else
   {
   StoredClass* pClass=&m_StoredClass;
    ar >> pClass;
   }
}

Сохраняется в файл чтото левое - "яя StoredClass"
Восстановить по вот этому класс невозможно.
Что я делаю нетак?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #29 : 19-09-2005 09:32 » 

StoredClass   m_StoredClass;
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines