Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохрание целого класса, и загрузка 
:(
    Опции темы
Dr.Wisdom
Дата 1.11.2005, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 6.1.2005

Репутация: нет
Всего: 0



Есть класс. там только простые типы ( int, char[1000] итп)
хочу его сохранить в файл.
пишу
Код

class Q
{
ляля
}
............
Q* element = new Q;
...........
ofstream ofl("C:\\temp\\test.tst");
ofl.write((char*)element,sizeof(Q));
ofl.close();

и оно работает, а когда пишу
Код

class Q
{
ляля
}
............
Q* element = new Q;
ifstream ofl("C:\\temp\\test.tst");
ofl.get((char*)element,sizeof(Q));
//ofl.read((char*)element,sizeof(Q));
ofl.close();

оно не работает!
Что мне делать. Я бы и сам разобрался (наверное, да нет, что там - я уверен), но сроки поджимают. Поэтому спрашиваю.

Итак вопрос: написать в файл, а потом загрузить кучу одинаковых классов. smile
--------------------
VIVA LA RESISTANCE
PM MAIL   Вверх
_hunter
Дата 1.11.2005, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



показывай код ( а не ляля ).


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NiJazz
Дата 1.11.2005, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



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

PM MAIL   Вверх
Dr.Wisdom
Дата 1.11.2005, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 6.1.2005

Репутация: нет
Всего: 0



_hunter, ты хотел код?
Код

class Question
{
public:

 Question* next;
 Question* prev;

 short answer_number;

 AnsiString get_answer(int);
 AnsiString get_question();

 void set_answer(int, AnsiString);
 void set_question(AnsiString);


 Question();
 ~Question();

#ifndef DEBUG
private:
#endif

 char answers[10][1000];
 char question[1000];

};

Вот он.

NiJazz, такое возможно. Даже в Либерти прописано.
--------------------
VIVA LA RESISTANCE
PM MAIL   Вверх
sergejzr
Дата 1.11.2005, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360





--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
NiJazz
Дата 1.11.2005, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Dr.Wisdom
Так тебе же нужно загрузть данные из класса? Так напиши еще два метода: SaveToFile и LoadFromFile, которые будут сохранять содержимое в файл и загружать из файла соответственно.
PM MAIL   Вверх
srd
Дата 1.11.2005, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Цитата(Dr @ 2.11.2005, 00:32)
class Question
{
public:
Question* next;
Question* prev;

А говоришь, только простые типы. Какой смысл писать в файл указатели?


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Neitron
Дата 1.11.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



Тем более AnsiString тоже является неявным указателем.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Chaos A.D.
Дата 1.11.2005, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

Репутация: 6
Всего: 7



У тебя в классе указатели - это не очень благоприятно для сериализации. Тут нужно либо заменять их интеллектуальными указателями, либо избавиться от них.

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

Вообще, если тебе нужно просто заставить твой код работать, и сохранять все в файл - тут работы на пять минут. И тут нужно либо писать все в ужасном стиле, либо переписывать твой код. Но я готов помочь. Если есть желание написать в образовательных целях свою обобщенную реализацию, то я с удовольствием приму участие. Ты только скажи, что тебе нужно. Меня заинтересовал вопрос обобщенной реализации.

2 sergej.z
Не в обиду будет сказано chipset-у - воистину убогая реализация, которая работает только с объектами, имеющими тривиальный конструктор, с Plain Old Data, другими словами.
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
sergejzr
Дата 1.11.2005, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



А может лучше подойдёт fastdb?



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Chaos A.D.
Дата 1.11.2005, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

Репутация: 6
Всего: 7



Цитата(sergej @ 1.11.2005, 22:51)
А может лучше подойдёт fastdb?


Никогда о таком не слышал. Скачал сырцы, на досуге посмотрю. Но вообще готовых реализаций валом. Скажем, есть у Александреску в Современном проектировании на С++, или boost.serialization. Самому бы что-нибудь написать хотелось, для самообразования.
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
sergejzr
Дата 1.11.2005, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



fastdb мощнее. Это не просто сериализация, но и база данных, откуда можно обьекты забирать с помощью SQL (ну или почти SQL). Либа малюсенькая, но мощная и кроссплатформенный код.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Dr.Wisdom
Дата 3.11.2005, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 6.1.2005

Репутация: нет
Всего: 0



Цитата(Chaos @ 1.11.2005, 22:31)
У тебя в классе указатели - это не очень благоприятно для сериализации. Тут нужно либо заменять их интеллектуальными указателями, либо избавиться от них.

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

Вообще, если тебе нужно просто заставить твой код работать, и сохранять все в файл - тут работы на пять минут. И тут нужно либо писать все в ужасном стиле, либо переписывать твой код. Но я готов помочь. Если есть желание написать в образовательных целях свою обобщенную реализацию, то я с удовольствием приму участие. Ты только скажи, что тебе нужно. Меня заинтересовал вопрос обобщенной реализации.

Угу. Уяснил. Подумаю про указатели.

Что такое интелектуальные указатели не знаю. Избавлюсь.
Правда у меня там динамичный список, но я уже знаю как сделаю.
(где наша не пропадала - наша пропадала везде)

Публиковаться не хотелось бы - начальство п**дов вкачает, но готов сотрудничать.
У меня есть прога - трйнинг, которую я написал чтоб разобраться.

Вобщем то вот код для BC6

Код

class test
{
 public:
  char one[100];
  char two[100];
};
.............................
void __fastcall TForm1::Button1Click(TObject *Sender)
{
test t1, t2;

for(int i = 1; i < Edit1->Text.Length(); i++)
        {       t1.one[i-1] = Edit1->Text[i];       }

for(int i = 1; i < Edit2->Text.Length(); i++)
        {       t1.two[i-1] = Edit2->Text[i];       }

for(int i = 1; i < Edit3->Text.Length(); i++)
        {       t2.one[i-1] = Edit3->Text[i];       }

for(int i = 1; i < Edit4->Text.Length(); i++)
        {       t2.two[i-1] = Edit4->Text[i];       }


ofstream f("C:\\TEMP\\TRAIN.TXT");
f.write((char*)&t1,sizeof(test));
f.write((char*)&t2,sizeof(test));
f.close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
test t1, t2;
ifstream f("C:\\TEMP\\TRAIN.TXT");

f.read((char*)&t1,sizeof(test));
f.read((char*)&t2,sizeof(test));

f.close();

AnsiString s1,s2,s3,s4;
for(int i = 0; i < 5; i++)
{
  s1 += t1.one[i];
  s2 += t1.two[i];
  s3 += t2.one[i];
  s4 += t2.two[i];
}

  Edit1->Text = s1;
  Edit2->Text = s2;
  Edit3->Text = s3;
  Edit4->Text = s4;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 test t1, t2;
 for(int i = 0; i < 10; i++)
 {
   t1.one[i] = '1';
   t1.two[i] = '2';
   t2.one[i] = '3';
   t2.two[i] = '4';
 }

AnsiString s1,s2,s3,s4;
for(int i = 0; i < 5; i++)
{
  s1 += t1.one[i];
  s2 += t1.two[i];
  s3 += t2.one[i];
  s4 += t2.two[i];
}

  Edit1->Text = s1;
  Edit2->Text = s2;
  Edit3->Text = s3;
  Edit4->Text = s4;
}

принцып тот и он работает, теоретически для любого класа из вышеопределнных.
--------------------
VIVA LA RESISTANCE
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.