![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Нигде не могу найти нормальной документации, как это реализовать на С++.
В поиске посылают либо в MFC, либо в boost Может кто видел статью подобную? |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Xenon, Так ее суть в том, чтобы все члены данные засунуть в непрерывный кусок памяти по порядочку, а потом их достать от туда (если речь идет о сериализации в память или в двоичный файл). Что тут, собственно, такого? Зачем что-то искать? Даже на Java, на сколько я знаю, нет встроенного решения. Это всегда вручную делается. (Хотя я могу ошибаться)
Это сообщение отредактировал(а) SaDFromSpb - 9.12.2006, 21:26 -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
SaDFromSpb, ну в MFC есть Archive, в С++ можно подклчить Boost - это уже, так сказать, костыли помощи
Daevaorn, у меня просто имеется вектор указателей на объекты классов, в которых есть поля типа string. Мне нужно каким-то образом это в бинаромном виде сохранить, а потом иметь возможность восстановить(прочитать). |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
boost::serialization - самый быстрый(в интеграции) и простой способ |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Daevaorn, а если самому?
А нет по boost`у хелпа на русском? |
|||
|
||||
| WERITAS |
|
|||
|
******** ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 2.5.2005 Где: Москва Репутация: нет Всего: 5 |
Функцию Serialiaze ты сам будешь писать -------------------- Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак" |
|||
|
||||
| zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
Сериализация - тема очень интересная, хорошей общей обзорной статьи не встречал. По-моему, эту часть языка ооочень неплохо было бы стандартизировать. Ай! Ногами не пинать, сам могу примеров пачку придумать, для которых стандарт фиг придумаешь.
--------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Xenon, юзай буст - не ошибёшься. Возможностей в буст::сериализейшен куча, даже если сейчас все не будешь использовать - потом оценишь. Плюс великолепный дизайн и удобство использования. Там достаточно понятные туториалы (хоть и на инглише).
|
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Любитель, просто мне казалось, что это будет забиванием гвоздей микроскопом
А по бусту есть русский мануал? |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
В принципе если хочешь сделать сам, то это не так уж сложно. Если ты знаешь (можно константу какую-нибудь в начале записать) какие классы у тебя в векторе и какие в них данные, то: запись - пишешь размер вектора = х - for (int i=0; i<x; i++) { - пишешь по очереди все статические данные - пишешь длину строки - пишешь саму строку } чтение - читаешь размер вектора, создаёшь его - for (int i=0; i<x; i++) { - читаешь по очереди все статические данные - читаешь длину строки, удлиняешь строку в классе до нужного размера - читаешь саму строку } -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Xenon |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
nickless, у меня даже статики нет, только string поля.
Вот, чтобы проще было (код класса, адресса на объекты которого хранятся в деке:
А двунаправленный список объявлен так в классе Cmanager:
|
||||
|
|||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Ну вот и добавь туда что-то вроде save_to_file(std::ofstream&) и Calbum(const std::ifstream&), которые пишут/читают year, потом длину genre, сам genre, длину artist, сам artist ...
Потом останется только записать кол-во элементов в deque и пройтись по нему итератором -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
nickless, я только думаю ... Эти все данные представить в виде структуры, или просто подряд писать и все? И как лучше: записать размеры всех переменных, потом само содержимое, либо по-очередно размер/содержимое?
|
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Xenon, мое мнение - поочередно размер/содержимое. Получится скромненькая структурка.
|
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Xenon, делай как тебе удобнее, если писать сначала размер всех переменных, можно и структуру сделать и назвать "CalbumHeader", но ИМХО не стоит оно того, у тебя статических переменных то почти нет.
поддерживаю -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Вот написал такой бред - вылетает на втором write с ошибкой доступа ... Где я туплю активно?
|
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Сдается мне, что проблема в том, что size() для string размер возвращает в size_t, а нужен int ...
|
|||
|
||||
| nickless |
|
||||||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Вот тут:
Ты интерпретируешь размер строки как указатель, надо примерно так:
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||||||
|
|||||||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
А без лишних переменных?
Добавлено @ 01:08 и можно потолковее это сделать? А то выглядить достаточно громоздко |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Без переменных имхо не получится, write() требует указатель, а для этого нужна переменная.
Можно только что через operator<< попробовать, но он вроде только в текстовом модусе работает. edit: Да, выглядит не очень Если все размеры записать в структуру, то reinterpret_cast потребуется только один раз, но появится лишняя структура... Это сообщение отредактировал(а) nickless - 12.12.2006, 01:22 -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
nickless, жаль
Спасибо |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Всегда пожалуйста
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| satrap |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
-- cut --
Это сообщение отредактировал(а) satrap - 23.1.2007, 21:24 |
|||
|
||||
| Xenon |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
nickless, а считывать как? Столкнулся просто с проблемой ... Я читаю файл пока не достигну конца. В начале цикла я создаю переменные, которые мне нужно считать.
Потом начинаю читать:
Придется создать переменную buf, типа char, в нее считывать данные, а потом присваивать полю artist и т.д? |
||||
|
|||||
| Oleg_Ci |
|
||||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 3 Всего: 30 |
|
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Олег4, не пойдет.
std::string::c_str() возвращает const char*. Читать в прямо в строку не получится. Да и нельзя. Придется использовать буфера. |
|||
|
||||
| Oleg_Ci |
|
|||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 3 Всего: 30 |
||||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Опасно. У меня был случай, когда std::string не был цельным куском памяти
|
|||
|
||||
| Romikgy |
|
||||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
имхо данный код корректен
это смотря что делаешь со строкой, хотя по стандартам такого быть не должно -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
в данном случае возвращает указатель на буфер хранящий строку в классе! т.к. память под него выделена , ничего криминального в этом коде нет! однако по стандартам С++ эти действия не совсем хороши, ибо на это не задумывался класс стринг! (но и не смертельно!) что это? то что вектор будет расположен в памяти последовательно? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Он вовсе не обязан быть цельным куском.
|
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Любитель, что?
Данные вектора(0 -- size()-1) не обязаны быть цельным куском? |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
JackYF, не заметил третью страницу
|
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Любитель, я уже было подумал, что я тупой
Значит нет нормального выхода? |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Если string действительно не обязан быть одним куском, то пожалуй на прямую записать туда чего-нибудь не получится, да и нехорошо это как-то, в приватные переменные в наглую писать
Кроме как через промежуточный буффер, можно еще посимвольно читать, но медленно наверно будет. Если в строке нет нулей (что в принципе нормально edit У меня (gcc, линь) вот так:
Это сообщение отредактировал(а) nickless - 12.12.2006, 19:33 -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Oleg_Ci |
|
|||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 3 Всего: 30 |
||||
|
||||
| Xenon |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Ну не понимаю я что за занос на виражах, правильно же теперь уж все делаю (несмертельно)
Выбрасывает istream на строчке
Сохранял данные так:
|
||||||
|
|||||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Romikgy, я так и не понял ... судя по всему вообще вылетала на cin.getline ... Чего-то не понял почему, ну да пофиг, главное файл симпортился, но только но одна запись и почему-то у названия альбома отрезаны три буквы.
Добавлено @ 21:39 Сейчас вообще на отрывании здох (стал активно хрустеть хард) ... эээ |
|||
|
||||
| nickless |
|
||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Ты когда третью строку читаешь, берешь длину второй. -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||
|
|||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
У мя так работает без проблем
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
nickless, мля ... Спасибо за хелп
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |