USBLexus
Опытный
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
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #1 : 14-09-2005 06:32 » |
|
а если что то типа дампа памяти в которой хранится экземпляр класса?
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #2 : 14-09-2005 06:36 » |
|
Я об этом думал но нужен размер класса в памяти и sizeof здесь не подходит Я слышал проблемма както решается с помощью сериализации, никто не в курсе?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Hooter
|
|
« Ответ #3 : 14-09-2005 06:39 » |
|
при сохранении строки обычно делают что-то вроде этого: сохраняют сначала ее длину, а затем сохраняют всю строку.
при чтении из файла - обратная последовательность: читаешь длину строки, а затем читаешь указанное количество символов.
|
|
|
Записан
|
|
|
|
Hooter
|
|
« Ответ #4 : 14-09-2005 06:40 » |
|
а что касается CString, то сначала читешь из файла строку, а затем создаешь класс (или просто присваиваешь) CString.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #6 : 14-09-2005 06:45 » |
|
а что касается CString, то сначала читешь из файла строку, а затем создаешь класс (или просто присваиваешь) CString.
Структура класса мне неизвестна Я не знаю есть ли там CString или нет а может там CRect?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 14-09-2005 06:48 » |
|
а читать из файла так: узнаём длину, создаём чар-массив, ДОПИСЫВАЕМ НОЛЬ(а то вылет обеспечен), читаем в него, а затем присваиваем стрингу:
CString str;
//здесь читаем длину //...-> N
char *p=new char[N+1]; p[N]=0;
//здесь читаем из файла в p[] //...
//присваиваем str=p;
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #8 : 14-09-2005 06:51 » |
|
Алексеееей))) Do you hear me?)
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Hooter
|
|
« Ответ #9 : 14-09-2005 06:52 » |
|
Я слышал проблемма както решается с помощью сериализации, никто не в курсе?
стандартный механизм сериализации (я говорю о MSVC 6.0, может в 7-ом и по-другому) для CString сохраняет только содержимое строки, то есть сам текст. а читает - по отдельными словами. то есть стандартные операции сериализации сохранения/чтения для CString не являются обратными к друг другу. можно переопределить сериализацию для класса унаследованного от CString. но оно тебе надо? я обычно делал дополнительную функцию, которая реализовывала описанный мною выше механизм сохранения строки. такой способ катит даже если ты сериализацию используешь..
|
|
|
Записан
|
|
|
|
Hooter
|
|
« Ответ #10 : 14-09-2005 06:53 » |
|
а что касается CString, то сначала читешь из файла строку, а затем создаешь класс (или просто присваиваешь) CString.
Структура класса мне неизвестна Я не знаю есть ли там CString или нет а может там CRect? А, извини. Тогда действительно можно унаследовать класс от CString и переопределить Serialize.
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #11 : 14-09-2005 07:00 » |
|
Видишь ли я не знаю есть там CString или нет для меня этот класс как черный ящик
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 14-09-2005 07:07 » |
|
USBLexus i hear просто когда я писал твоего поста не было ещё. Если класс - чёрный ящик, тогда - дрова. Никак ты его, если в него не встроено сохранение. С другой стороны - как в смысте ЧЯ ? ты знаешь, какие именно свойства надо сохранить - ты их и сохрани, а при загрузке - создай экземпляр класса и залей в него эти свойства
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 14-09-2005 07:08 » |
|
если ты пишешь этот класс, ты ему встой методу
Сахраницца();
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #14 : 14-09-2005 07:25 » |
|
ЧЯ в том смысле что я получаю класс на входе шаблонной функции и тип он следовательно может иметь любой Мне его нужносохранить на диск но вот проблема как это сделать... И пишу его не я
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Hooter
|
|
« Ответ #15 : 14-09-2005 07:32 » |
|
Для тебя какой класс как ЧЯ? DataToSave? или его член CString/CRect/CSomething...?
Если DataToSave, то его разработчик должен позаботиться о механизме сериализации... А тебе достаточно будет вызвать Serialize.
|
|
« Последнее редактирование: 14-09-2005 07:34 от Hooter »
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #16 : 14-09-2005 07:33 » |
|
Для тебя какой класс как ЧЯ? DataToSave? или его член CString/CRect/CSomething...?
DataToSave
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Hooter
|
|
« Ответ #17 : 14-09-2005 07:34 » |
|
Если DataToSave, то его разработчик должен позаботиться о механизме сериализации... А тебе достаточно будет вызвать Serialize.
|
|
|
Записан
|
|
|
|
Hooter
|
|
« Ответ #18 : 14-09-2005 07:37 » |
|
А что вообще тебе известно о DataToSave?
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #19 : 14-09-2005 07:38 » |
|
Если DataToSave, то его разработчик должен позаботиться о механизме сериализации... А тебе достаточно будет вызвать Serialize.
Это както неудобно разрабатывать метод для каждого класса в принципе сейчас оно все так и реализовано). Хотелось бы автоматизировать процесс...
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #20 : 14-09-2005 07:39 » |
|
А что вообще тебе известно о DataToSave?
Что это класс))
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Hooter
|
|
« Ответ #21 : 14-09-2005 07:46 » |
|
А что вообще тебе известно о DataToSave?
Что это класс)) Ну, например, какие нибудь ограничения.. типа на вход твоей шаблонной функции может быть подан только класс унаследованный от CObject. Или на вход шаблонной функции могут быть поданы только классы только определенного множества типов (например только CDataToSave, COtherDataToSave и CAnotherDataToSvae) ? Хотя даже в этом случае тебе придется написать проседуру сохранения для каждого класса...
|
|
« Последнее редактирование: 14-09-2005 07:49 от Hooter »
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #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, тогда это работает.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Джон
просто
Администратор
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
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #24 : 14-09-2005 10:22 » |
|
Malaja,
Спасибо! Классно, по виду вроде то что надо:))))))))))))))))))))))) Попробую внедрить как разгребусь немножко %) Отпишу потом что получится!
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #25 : 14-09-2005 10:24 » |
|
В крайнем случае обяжи разработчика сделать хотябы функцию GetSize(), тогда ты сможешь сохранять кусок памяти. А иначе задача не имеет решения
Думаю что я могу заставить разработчика класса унаследовать его от CObject
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Malaja
|
|
« Ответ #26 : 14-09-2005 10:29 » |
|
USBLexus, просто если класс гуляет как кошка, т.е. сам по себе, и о нем ничего вообще неизвестно, плюс у него нет никакой реализации для сериализации, то я даже понятия не имею, как это можно сохранить (Джон об этом уже написал). Приведенный мной пример работает, т.к. проект живет уже долго и даже иногда счастливо
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Джон
просто
Администратор
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
Опытный
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
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #29 : 19-09-2005 09:32 » |
|
StoredClass m_StoredClass;
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
|