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

Поиск:

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


Эксперт
****


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

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



У меня есть класс, который включает в себя структуру. И есть переменная типа того класса.
После определённых преобразований переменная заполняется значениями.
Вопрос: возможно ли записать эту переменную в файл, и чтобы потом её можно было считать из файла, в идентификатор такого же типа.
Вот пример класса:
Код

struct Questin                //Тип вопрос для теста с варимнтАМИ ответОВ
{
  string qust;                //идентификатор вопроса
  vector<string> answer;      //идентификатор варианта ответа
  vector<bool> err;           //идентификатор правильности ответа
};

class TEST                    //Класс создающий тип Тест
{
  public:
    string Capt;              //Заголовок тестов
    vector<Questin> answers;  //ВопросЫ к тесту
};
.............
TEST Test;       //глобальная переменная теста


Это сообщение отредактировал(а) Zero - 8.10.2005, 22:56
PM MAIL ICQ   Вверх
bel_nikita
Дата 8.10.2005, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Вопрос: возможно ли записать эту переменную в файл, и чтобы потом её можно было считать из файла, в идентификатор такого же типа.

Можно smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
np9mi7
Дата 9.10.2005, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Zero, посмотри по этой ссылкеhttp://forum.vingrad.ru/index.php?showtopic=65661, может поможет....


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Dr.Wisdom
Дата 9.10.2005, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если я правильно понял......
Код

class bzzz
{
..............
}
...................
bzzz B;
..................
ofstream ofl("file.fil");
ofl.put((char)B,sizeof(bzzz));
ofl.close();

Если я правильно понял.
--------------------
VIVA LA RESISTANCE
PM MAIL   Вверх
Void
Дата 9.10.2005, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Dr.Wisdom
Ну-ну... попробуй так "сериализовать" структуру, которую написал Zero. А потом считай то, что записал... На результаты полюбуемся.

По сабжу: я бы рекомендовал курить Boost.Serialization, но я не помню, в каких она отношениях с Билдером. Скорее всего, в не очень хороших. Может, можно будет обойтись и своим велосипедом. В любом случае, вектор надо будет писать поэлементно.


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


Эксперт
****


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

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



Цитата(Void @ 9.10.2005, 15:33)
я бы рекомендовал курить Boost.Serialization

Блин, да я в английском "баклажан". smile
Цитата(Dr @ 9.10.2005, 13:10)
Если я правильно понял.

Да, но как я её считывать то буду???
Добавлено @ 19:02
Пардон, я структуру уже немного изменил:
Код

struct Questin                //Тип вопрос для теста с варимнтАМИ ответОВ
{
  string qust;                //идентификатор вопроса
  vector<string> answer;      //идентификатор варианта ответа
  vector<bool> 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;              //Счётчик кол-ва вариантов ответов
};

PM MAIL ICQ   Вверх
np9mi7
  Дата 9.10.2005, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Void, товарищ не грубите новичкам....
Цитата
bool ToStream (std::ostream&) const и bool FromStream (const std::istream&)

Dr.Wisdom, просто необходимо корректо написать метод загрузки/выгрузки из (в) потока.
Цитата
По сабжу: я бы рекомендовал курить Boost.Serialization, но я не помню, в каких она отношениях с Билдером. Скорее всего, в не очень хороших.
, корретно работает с http://www.boost.org/libs/serialization/do...on.html#borland, думаю и со следующими версиями тоже....

Это сообщение отредактировал(а) np9mi7 - 9.10.2005, 19:09


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Zero
Дата 9.10.2005, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ладно, если с векторами нельзя, а как насчёт того, если я их заменю на динамический массив, или это тоже проблемы записи +чтение не решит???? smile
PM MAIL ICQ   Вверх
Void
Дата 9.10.2005, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Цитата(np9mi7 @ 9.10.2005, 21:05)
Void, товарищ не грубите новичкам....

Ни в коем разе smile
Dr.Wisdom smile

Цитата(Zero @ 9.10.2005, 21:34)
Ладно, если с векторами нельзя, а как насчёт того, если я их заменю на динамический массив, или это тоже проблемы записи +чтение не решит????

Не суть важно. Все равно, записать структуру как один непрерывный кусок памяти не получится. Поэтому, как пишет np9mi7, надо реализовать методы сохранения и загрузки. Примерная, не претендующая на корректность, реализация:
Код

void Questin::save(std::ostream &os) const {
    os << qust << std::endl;
    os << answer.size() << std::endl;
    std::copy(answer.begin(), answer.end(),
        std::ostream_iterator<std::string>(os, "\n"));
    os << err.size() << std::endl;
    std::copy(err.begin(), err.end(),
        std::ostream_iterator<bool>(os, " "));
}

void Questin::load(std::istream &is) {
    std::getline(is, qust);
    int n;
    is >> n;
    answer.reserve(n);
    for (int i = 0; i < n; ++i)
        std::string s;
        std::getline(is, s);
        answer.push_back(s);
    }
    is >> n;
    err.reserve(n);
    for (int i = 0; i < n; ++i) {
        bool b;
        is >> b;
        answer.push_back(b);
    }
}


А вообще, раз Boost.Serialization нормально живет с BCB - лучше использовать ее. Геморрой снизится на порядок.


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


Эксперт
****


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

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



Цитата(Void @ 9.10.2005, 19:52)
Примерная, не претендующая на корректность, реализация:

А это, чёто я не понял, это чё сохранение и загрузка файла, а путь где ставить то...
Цитата(Void @ 9.10.2005, 19:52)
записать структуру как один непрерывный кусок памяти не получится.

Енто почему??? smile
А я у препода в субботу спрашивал, как записать класс как одно целое, этот баклажан сам незначет, начал загонять какието записи по символьно и т.п.(отмаз от ответа), короче потом сказал, что всё что можно сделать не делфи, можно как то и на С++... А на делфи, тама я 3 семестра назад курсач делал, точнее тогда это был паскаль, то всё равно работал с записями, то что в С++ называется структурой, и там всё можно было...
По моему мнению, нельзя записывать только те вещи, которые являются не значениями, а дресами в памяти, т.е. адреса записывать естесно нет смысла, а если в структуре оставить только статические переменные то должно быть нормал.
Вот только тут не получается обоётись без динамики... smile
PM MAIL ICQ   Вверх
Void
Дата 9.10.2005, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Цитата(Zero @ 9.10.2005, 22:24)
А это, чёто я не понял, это чё сохранение и загрузка файла, а путь где ставить то...

Предположим, что наша структура уже реализует методы save и load. Тогда запись/чтение будут выглядеть примерно так:
Код

// Запись:
Questin q;
// blah-blah...
std::ofstream out("filename.dat");
q.save(out);

// Чтение:
Questin q;
std::ifstream in("filename.dat");
q.load(in);


Цитата(Zero @ 9.10.2005, 22:24)
По моему мнению, нельзя записывать только те вещи, которые являются не значениями, а дресами в памяти, т.е. адреса записывать естесно нет смысла, а если в структуре оставить только статические переменные то должно быть нормал.

Совершенно верно. Так вот, реализации std::string и std::vector среди прочего как раз и содержат эти адреса (указатели на свое реальное содержимое).

Это сообщение отредактировал(а) Void - 9.10.2005, 20:34


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


Эксперт
****


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

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



Цитата(Void @ 9.10.2005, 20:33)
Предположим, что наша структура уже реализует методы save и load. Тогда запись/чтение будут выглядеть примерно так:

А-а-а... это ты функции-члены для структуры создал... smile
Но сдесь не совсем всё просто, на самом деле эта структура, является всего лиш типом, для класса, который описан чуть ниже... smile Вот тут реальный класс, который у меня сейчас есть... Видимо, идея с записью структуры у меня не выдет. smile
Но я уже придумал "велосипед":
Я создам функцию член, в ней, которая будет переписывать содержимое адресов, в тестовый файл, а потом его будет легко загрузить
PM MAIL ICQ   Вверх
Void
Дата 9.10.2005, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Цитата(Zero @ 9.10.2005, 23:37)
Но сдесь не совсем всё просто, на самом деле эта структура, является всего лиш типом, для класса, который описан чуть ниже... smile Вот тут реальный класс, который у меня сейчас есть... Видимо, идея с записью структуры у меня не выдет. smile

По такому же принципу можно сериализовать и содержимое класса TEST. Кто мешает? smile

Цитата(Zero @ 9.10.2005, 23:37)
Я создам функцию член, в ней, которая будет переписывать содержимое адресов, в тестовый файл, а потом его будет легко загрузить

Честно говоря, не совсем понял, что ты собираешься сделать... Но на рабочий велосипед непохоже smile


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


Эксперт
****


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

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



Цитата(Void @ 9.10.2005, 21:42)
Кто мешает?

Да я пока плохо знаю С++, и не очень понял, что там за принцип... Я думаю если я буду с этим разбиратся то это будет надолго. А курсач предназначен для того чтобы я просто разобрался с классами и некоторыми особенностями языка.
Цитата(Void @ 9.10.2005, 21:42)
Честно говоря, не совсем понял, что ты собираешься сделать... Но на рабочий велосипед непохоже

Я синтаксически не правильно написал слово
Цитата(Zero @ 9.10.2005, 21:37)
тестовый файл

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


λcat.lolcat
****


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

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



Цитата(Zero @ 10.10.2005, 09:58)
Да я пока плохо знаю С++, и не очень понял, что там за принцип...

Принцип простой - писать содержимое класса поэлементно, вплоть до тех элементарных типов, которые можно выводить в поток напрямую (int, string, etc) + некоторую служебную информацию, как например длина сохраненного вектора, чтобы его потом можно было корректно считать.


*в сторону* О Комитет! Когда ты дашь нам рефлексию и стандартный способ сериализации, чтобы люди вот так не мучались...


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0694 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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