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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как записать переменную типа class в файл, и обратно 
:(
    Опции темы
Zero
Дата 10.10.2005, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

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



Цитата(Void @ 10.10.2005, 08:41)
чтобы люди вот так не мучались...

Ага, вот когда напишут какую-нибудь библиотеку для корректной записи в файл переменных типа класса тогда можно будет нормально прогать... smile
PM MAIL ICQ   Вверх
Void
Дата 10.10.2005, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Zero @ 10.10.2005, 11:22)
Ага, вот когда напишут какую-нибудь библиотеку для корректной записи в файл переменных типа класса тогда можно будет нормально прогать...

Так с Boost.Serialization все, что от тебя потребуется, это:
Код

struct Questin
  string qust;
  vector<string> answer;
  vector<bool> err;
  // метод сериализации
  template <class Archive>
  void serialize(Archive &ar, const unsigned version) {
    ar & qust & answer & err;
  }
};
//...
class TEST
{
  public:
    void AddQuest();
    void AddAnswer();
    string Capt;
    vector<Questin> answers;
    double Estimation[4];
    int Nquest;
  private:
    string TekstVoprosa;
    string TekstVariantaOtvetov;
    int Nanswer;
    // метод сериализации
    friend class boost::serialization::access;
    template <class Archive>
    void serialize(Archive &ar, const unsigned version) {
        ar & Capt & answers & Estimation & Nquest & TekstVoprosa & TekstVariantaOtvetov &
            Nanswer;
    }
};
// blah-blah
TEST test;
std::ofstream out("filename.dat");
boost::archive::text_oarchive oa(out);
oa << test; // вот и все, что нужно для записи в файл :)

Другое дело, что даже этой писанины можно было бы избежать при наличии рефлексии.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Zero
Дата 10.10.2005, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

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



Цитата(Void @ 10.10.2005, 09:44)
все, что от тебя потребуется, это:

Эх, не работает она у меня... smile Только я ведь не консольное же приложение пишу а в билдере, в реале у меня выглядит всё вот так:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <Vector>
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;

typedef char* charptr;        //Для динамического массива типа CHAR

struct Questin                //Тип вопрос для теста с варимнтАМИ ответОВ
{
  string qust;                //идентификатор вопроса
  vector<string> answer;      //идентификатор варианта ответа
  vector<bool> err;           //идентификатор правильности ответа
  // метод сериализации    
  template <class Archive>    
  void serialize(Archive &ar, const unsigned version) {ar & qust & answer & err;}
};

class TEST                    //Класс создающий тип Тест
{
  public:
    void AddQuest();
    //Предусловие: текст вопроса введённый пользователем
    //Постусловие: запись данного текста в переменные класса

    void AddAnswer();
    //Предусловие: текст варианта ответа, и идентификатор правильного
    //ответа введённые пользователем
    //Постусловие: запись данной информации в структуру класса

    string Capt;              //Заголовок тестов
    vector<Questin> answers;  //ВопросЫ к тесту
    double Estimation[4];     //Оценки на вопросы
    int Nquest;               //Счётчик кол-ва вопросов
  private:
    string TekstVoprosa;
    string TekstVariantaOtvetov;
    int Nanswer;              //Счётчик кол-ва вариантов ответов
    // метод сериализации    
    friend class boost::serialization::access;    
    template <class Archive>    
    void serialize(Archive &ar, const unsigned version)
    {ar & Capt & answers & Estimation & Nquest & TekstVoprosa & TekstVariantaOtvetov & Nanswer;}
};

#pragma hdrstop

#include "CT.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int N=0;                  //Номер символа для которого ведётся обработака
TEST Test;                //Глобальная переменная теста
charptr Memo;             //Содержимое всей структуры Теста
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  //Проверить на наличие ошибок
  if (strlen(Edit3->Text.c_str())==0)
    {
      ShowMessage("Заголовок вопроса отсутствует.");
      Edit3->SetFocus();
      return;
    };

  //Управление показом объектов
  BitBtn1->Enabled = false;
  Edit3->Enabled = false;
  BitBtn2->Enabled = true;
  
  //Автоматическое добавление номера вопроса
  if (Test.Nquest != 0)
    Memo1->Lines->Add("");
  char zagolovok[20]="ЎВопрос № ";
  strcat(zagolovok,IntToStr(++Test.Nquest).c_str());
  Memo1->Lines->Add(zagolovok);

  //Автоматическое заполнение заголовков вопросов
  char str[256]="<1:¶";
  strcat(str,Edit3->Text.c_str());
  strcat(str,"¶:1>");
  Memo1->Lines->Add(str);
  Edit4->SetFocus();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
  //Проверить на наличие ошибок
  if (strlen(Edit4->Text.c_str())==0)
    {
      ShowMessage("Заголовок варианта ответа отсутствует.");
      Edit4->SetFocus();
      return;
    };

  //Управление показом объектов
  BitBtn1->Enabled = true;
  Edit3->Enabled = true;
  Edit3->Clear();

  //Автоматическое заполнение вариантов ответов
  char str[256]="<2:¶";
  if (CheckBox1->Checked==false)  //добавить правильный вариант
    strcat(str,"0¶");
  else
    strcat(str,"1¶");

  strcat(str,Edit4->Text.c_str());
  strcat(str,"¶:2>");
  Memo1->Lines->Add(str);
  CheckBox1->Checked = false;
  Edit4->Clear();
  Edit4->SetFocus();  
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
//Установить режим редактирования структуры теста
{Memo1->Enabled = (Memo1->Enabled==false)? true: false;}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn4Click(TObject *Sender)
{Application->Terminate();} //закрыть программу
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
  //Наполнить массив Memo символами структуры теста
  Memo = new char[strlen(Memo1->Lines->Text.c_str())];
  strcpy(Memo,Memo1->Lines->Text.c_str());

  //Переписать их в соответствии с синтаксисом в переменную класса
  Test.Nquest = 0;  //Обнулить счётчик кол-ва вопросов

  //Шаг 1: добавить заголовок тестов в структуру класса
  Test.Capt = Edit1->Text.c_str();

  while (N < IntToStr(StrToInt(strlen(Memo))))
    {          
      //Шаг 2: определить номер вопроса
      if (Memo[N] == 'Ў') Test.Nquest++;
      
      //Шаг 3: поиск символа "<", символизирующего начало текста вопроса ИЛИ варианта ответа
      if (Memo[N++] != '<') continue;

      //Шаг 4: определение вида предложения (вопрос или вариант ответа)
      //Если текущая строка соответствует тексту вопроса,
      //тогда добавить в структуру класса текущий текст
      if (Memo[N] == '1') Test.AddQuest();

      //Если текущая строка соответствует тексту варианта ответа,
      //тогда добавить в структуру класса текущий вариант ответа
      if (Memo[N] == '2') Test.AddAnswer();
    }

  //Шаг 5: добавить информацию об оценках в переменную класса
  Test.Estimation[0] = StrToFloat(Edit5->Text);
  Test.Estimation[1] = StrToFloat(Edit6->Text);
  Test.Estimation[2] = StrToFloat(Edit7->Text);
  Test.Estimation[3] = StrToFloat(Edit8->Text);
}
//---------------------------------------------------------------------------

void TEST::AddQuest()
//Добваить в класс текст вопроса
{
   //Если добавляется ворпос,
   //то для него в данный момент не может быть ни каких вариантов ответов
   Test.Nanswer = 0;

   //Получить содержимое текста вопроса
   N = N + 3;
   Test.TekstVoprosa = "";
   while (Memo[N] != '¶') Test.TekstVoprosa = Test.TekstVoprosa + Memo[N++];

   //Добавить текст вопроса в переменную класса
   Test.answers.reserve(Test.answers.size()+1);
   Test.answers.resize(Test.answers.size()+1);
   Test.answers[Nquest-1].qust = Test.TekstVoprosa;
}
//---------------------------------------------------------------------------

void TEST::AddAnswer()
//Добавить в класс информацию о вариантах ответов
{
   //Определить и записать в класс правельный вариант ответа
   N = N + 3;
   Test.answers[Test.Nquest-1].err.reserve(Test.answers[Test.Nquest-1].err.size()+1);
   Test.answers[Test.Nquest-1].err.resize(Test.answers[Test.Nquest-1].err.size()+1);
   Test.answers[Test.Nquest-1].err[Test.Nanswer] = (Memo[N] == '0')? false: true;

   //Получить содержимое текста ответа на вопрос
   N = N + 2;
   Test.TekstVariantaOtvetov="";
   while (Memo[N] != '¶') Test.TekstVariantaOtvetov = Test.TekstVariantaOtvetov + Memo[N++];

   //Добавить текст ответа на вопрос в переменную класса
   Test.answers[Test.Nquest-1].answer.reserve(Test.answers[Test.Nquest-1].answer.size()+1);
   Test.answers[Test.Nquest-1].answer.resize(Test.answers[Test.Nquest-1].answer.size()+1);
   Test.answers[Test.Nquest-1].answer[Test.Nanswer++] = Test.TekstVariantaOtvetov;
}
//---------------------------------------------------------------------------
и компилятор выдаёт вот такое сообщение об ошибке:
Код

[C++ Error] CT.cpp(49): E2090 Qualifier 'boost' is not a class or namespace name
[C++ Error] CT.cpp(49): E2061 Friends must be functions or classes
Мож какую нить библиотеку надо подключить, а то я там вроде основные наподключал, ну чёто вроде не хватает... smile
PM MAIL ICQ   Вверх
Zero
Дата 10.10.2005, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

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



Вот навсякий случай архив, с моей программой, там после этого сериализованого класса выдаётся ошибка... smile

Это сообщение отредактировал(а) Zero - 10.10.2005, 10:40

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Test.zip 67,82 Kb
PM MAIL ICQ   Вверх
Void
Дата 10.10.2005, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Zero @ 10.10.2005, 12:31)
Эх, не работает она у меня...

smile Дык ее поставить и собрать надо. В поиск по ключевому слову Boost. Но учитывая, что с C++ ты недавно, лучше продолжай делать первоначальный вариант. Будут проблемы - поможем. А то с Бустом ты завязнешь надолго smile
Цитата(Zero @ 10.10.2005, 12:31)
Только я ведь не консольное же приложение пишу а в билдере

Не имеет значения.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Zero
Дата 10.10.2005, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

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



Цитата(Void @ 10.10.2005, 09:44)
все, что от тебя потребуется, это:

Цитата(Void @ 10.10.2005, 15:55)
Дык ее поставить и собрать надо. В поиск по ключевому слову Boost.

Цитата(Void @ 10.10.2005, 15:55)
А то с Бустом ты завязнешь надолго

Эх да тебя не поймёшь... smile
Цитата(Void @ 10.10.2005, 15:55)
лучше продолжай делать первоначальный вариант.

Ладно, а то я уж весь запутался... smile Сделаю перенос в текстовый и усё...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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