Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 542
#1

В каком формате лучше хранить историю работы приложения? - C++

02.07.2015, 19:36. Просмотров 740. Ответов 20
Метки нет (Все метки)

Подскажите, в чем обычно хранят данные различные игры под windows, которые не онлайн? Просто в бинарных файлах своей структуры без баз данных?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2015, 19:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В каком формате лучше хранить историю работы приложения? (C++):

В каком STL-контейнере лучше хранить объекты? - C++
Есть класс, реализующий адреса class address { ... } Поискал в сети увидел 3 варианта хранения объектов : массив(array),...

В каком виде хранить таблицу с данными? - C++
Есть две такие таблицы В каком виде их лучше представить в программе? обращения будут не частые но производительность желательна...

В каком виде хранить двоичные числа - C++
Здравствуйте! Подскажите, пожалуйста, в каком типе данных хранить двоичные числа, что бы ими можно было примерно так пользоваться: a =...

Как лучше всего хранить коэффициенты? - C++
Мне нужно работать с матрицей порядка 100 000. Она сильно разреженная, по этому хранить все коэффициенты - не вижу смысла. Стало быть нужно...

Где лучше хранить данные таблиц? - C++
Собираюсь написать свой справочник ГОСТовского металлопроката. И вот возник вопрос, где хранить табличные данные. Прописать массивы прямо в...

Задача на алгоритм Дейкстры (как лучше хранить информацию?) - C++
Доброго времени суток. Есть задача: Есть идея хранить входные данные след. образом: Выделить в памяти 2-х матрицы(Tab1 и Tab2...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sergash
0 / 0 / 0
Регистрация: 23.06.2015
Сообщений: 2
02.07.2015, 20:22 #2
Это смотря где. Некоторые используют базы данных, но зачастую используется какие нибудь велосипедные бинарные форматы.
0
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 542
02.07.2015, 20:41  [ТС] #3
а может подскажите, что проще использовать? вообще говоря нужжно обмениваться информацией с сервером(иногда, условно загрузка обновленных данных и передача некоторых результатов) и хранить историю работы приложения
0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
02.07.2015, 20:53 #4
Цитата Сообщение от klynxe Посмотреть сообщение
Просто в бинарных файлах своей структуры без баз данных?
базы данных это и есть "бинарные файлы со своей структурой".

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

Добавлено через 3 минуты
Цитата Сообщение от klynxe Посмотреть сообщение
а может подскажите, что проще использовать?
рекомендую глянуть в сторону Serialization - Boost
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
02.07.2015, 21:54 #5
Если нужна простая БД без дополнительной установки и прочих манипуляций, то советую SQLite глянуть. Ее легко таскать с собой и конечный пользователь даже не будет знать, что где-то там какая-то БД используется. В проект добавляется легко - просто 1 (!) файл рядом положить.
0
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 542
02.07.2015, 22:37  [ТС] #6
Цитата Сообщение от hoggy Посмотреть сообщение
рекомендую глянуть в сторону Serialization - Boost
Хм, интересно
А по скорости работы я смогу вести постоянную смену данных в файлах? Скажем так, хранить текущее состояние программы, то есть перезаписывать информацию довольно часто и на сколько это удобно?

Цитата Сообщение от Kastaneda Посмотреть сообщение
Если нужна простая БД без дополнительной установки и прочих манипуляций, то советую SQLite глянуть. Ее легко таскать с собой и конечный пользователь даже не будет знать, что где-то там какая-то БД используется. В проект добавляется легко - просто 1 (!) файл рядом положить.
О, вопрос, как человеку с опытом, дайте хоть пару ссылок нормальных (желательно с примером), как поставить SQLite и как его подключить к C++, инфы по SQL много, но толком как сделать нормальную локальную SQL БД без заморочек не нашел(

Ну и напоследок, есть ли какие-то критерии, когда лучше БД типа SQLite, а когда Serialization - Boost?
0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
03.07.2015, 00:06 #7
Цитата Сообщение от klynxe Посмотреть сообщение
А по скорости работы я смогу вести постоянную смену данных в файлах? Скажем так, хранить текущее состояние программы, то есть перезаписывать информацию довольно часто и на сколько это удобно?
чтение/запись - это очень медленные операции.

по возможности стремятся максимум данных держать в кэше
(хранилище данных, расположенное в оперативной памяти).

а на жесткий диск пишут лишь по необходимости.

Цитата Сообщение от klynxe Посмотреть сообщение
когда лучше БД типа SQLite, а когда Serialization - Boost?
вы не поняли.
это вещи из разных категорий.

БД - базы данных.
хранилища информации,
ориентированные на её быстрый поиск,
и возможность подключаться одновременно нескольким клиентам.

однако, прежде чем информация попадет в базу данных,
её ещё нужно где то раздобыть.

ваша программа должна сформировать какие то начальные данные,
которые вы хотите сохранить.

и вот, для того, что бы формировать эти данные,
здесь на помощь приходят технологии "сериализации данных".


сериализаторы типа boost.serialization
позволяют удобным и простым способом извлекать данные из объектов различных классов,
и объединять их в единую структуру:
бинарный файл, xml/json, и тп представления.
0
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 542
03.07.2015, 00:45  [ТС] #8
Цитата Сообщение от hoggy Посмотреть сообщение
сериализаторы типа boost.serialization
позволяют удобным и простым способом извлекать данные из объектов различных классов,
и объединять их в единую структуру:
бинарный файл, xml/json, и тп представления.
То есть сериализаторы используются для компоновки данных и далее готовые данные записываются в БД или файл?
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
03.07.2015, 01:00 #9
Цитата Сообщение от hoggy Посмотреть сообщение
БД - базы данных.
хранилища информации,
ориентированные на её быстрый поиск,
и возможность подключаться одновременно нескольким клиентам.
БД - хранилища структурированных данных. Представляет собой массивы однотипных структур (таблиц), с наперед заданным типом полей. А за "объединять их в единую структуру" при использовании БД надо бить по рукам.
0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
03.07.2015, 01:11 #10
Цитата Сообщение от klynxe Посмотреть сообщение
То есть сериализаторы используются для компоновки данных
для извлечения данных из объекта.
что с этими данными будет дальше,
сереализацию не интересует.

задача сериализации:
помочь программисту легко и быстро извлекать данные из объектов в какое либо представление
(например - обычный текстовый файл).

или напротив: имя на руках текстовый файл,
на его основе легко и быстро воссоздавать в программе объекты.

пример использования:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <algorithm>
#include <sstream>
#include <iostream>
#include <vector>
 
// стримы выполняют запись например, на жесткий диск
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/stream_buffer.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
 
// архив для формирования текстового представления данных
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
 
// архив для формирования бинарного представления данных
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
 
// на примере данного класса проиллюстрируем
// как сериализаторы могут извлекать данные из объектов
// или напротив, на основании имеющихся данных инициализировать объекты
class gps_position
{
private:
    // --- что бы сериализатор мог дотянуться до приватных данных
    friend class boost::serialization::access;
    
    
    // --- здесь описывается принцип сериализации/десериализации
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        (void)version;
        ar & degrees;   //<-- сначала в архив будет помещено содержимое этого члена
        ar & minutes;   //<-- затем, этого
        ar & seconds;   //<-- затем, этого
    }
 
    int degrees;
    int minutes;
    float seconds;
 
public:
    gps_position(){};
    gps_position(int d, int m, float s) :
        degrees(d), minutes(m), seconds(s)
    {}
 
    template<class T>
    friend std::basic_ostream<T>& 
    operator<<(std::basic_ostream<T>& os, const gps_position& v)
    {
        os << "[degrees = " << v.degrees << ", minutes = " 
            << v.minutes << ", seconds = " << v.seconds << "]";
        return os;
    }
};
 
void DemoTextSerialization()
{
    std::cout << "Demonstration of text serialization" << std::endl;
 
    // создаем текстовый поток ввода-вывода
    std::stringstream stream;
 
    // создаем объект, который хотим сериализовать
    gps_position source(35, 59, 24.567f);
    std::cout << "source = " << source << std::endl;
 
    {
        // создаем текстовый архив (хранилище данных)
        boost::archive::text_oarchive 
            oa(stream);
        
        // сериализуем объект (данные об объекте будут помещены в архив)
        oa << source;
 
        // здесь закончится время жизни архива, 
        // и он в диструкторе отправит все свое содержимое 
        // в поток ввода вывода, 
        // который мы ему указали при создании        
    }
 
    // выводим в консоль содержимое текстового архива
    // если бы мы вместо std::stringstream использовали бы файловый поток вводы-вывода
    // то данные были бы записаны на жесткий диск
    std::cout << "Data was serialized as: \n" 
        << stream.str() << std::endl;
 
    // теперь выполним обратное преобразование: 
    // из текста восоздадим объект
    
    // создаем объект с дефолтным состоянием
    gps_position dest;
    
    // теперь нужно наполнить объект данными из текстового файла
    {
        // создаем архив, указав поток ввода-вывода источника
        boost::archive::text_iarchive 
            ia(stream);
        
        // теперь читаем из архива, перенося данные в объект
        ia >> dest;
    }
 
    // готово! теперь выводим в консоль состояние объекта
    std::cout << "destination = " << dest << std::endl;
}
 
void DemoBinarySerialization()
{
    std::cout << "Demonstration of binary serialization" << std::endl;
 
    typedef std::vector<char> Blob;
    Blob buffer;
 
    boost::iostreams::stream<boost::iostreams::back_insert_device<Blob>> 
        os(buffer);
 
    // create source instance 
    gps_position source(35, 59, 24.567f);
    std::cout << "source = " << source << std::endl;
 
    {
        boost::archive::binary_oarchive 
            oa(os, boost::archive::archive_flags::no_header);
        
        oa << source;
    }
 
    os.flush();
 
    std::cout << "Data was serialized as: " << std::endl;
    std::cout.setf(std::ios::hex, std::ios::basefield);
    std::copy(buffer.begin(), buffer.end(), std::ostream_iterator<unsigned int>(std::cout));
    std::cout.unsetf(std::ios::hex);
    std::cout << std::endl;
 
 
    boost::iostreams::basic_array_source<char> bufSrc(&buffer[0], buffer.size());
    boost::iostreams::stream<decltype(bufSrc)> is(bufSrc); 
 
    gps_position dest;
 
    {
        boost::archive::binary_iarchive 
            ia(is, boost::archive::archive_flags::no_header);
        
        ia >> dest;
    }
 
    std::cout << "destination = " << dest << std::endl;
}
 
int main() 
{
    DemoTextSerialization();
    std::cout << std::endl;
    DemoBinarySerialization();
 
    return 0;
}
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
03.07.2015, 01:12 #11
Цитата Сообщение от klynxe Посмотреть сообщение
Ну и напоследок, есть ли какие-то критерии, когда лучше БД типа SQLite, а когда Serialization - Boost?
Нормальные БД поддерживают такие плюшки как атомарность и транзакции. То есть, если во время записи свет мигнул, база скорее всего не превратится в кашу. Чего, я так полагаю, нельзя сказать о Бусте и прочих велосипедах. Плюс, велосипед может оказаться весьма чувствителен к смене формата типа "добавили одно поле в сохраняемую структуру". С другой стороны, велосипед накодить значительно проще чем мучаться с SQL запросами. А то что при "свет мигнут" грохнется файл с сохранением, ну это не так страшно. Сейв - не готовой отчет бухгалтерии.
0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
03.07.2015, 01:18 #12
Цитата Сообщение от Renji Посмотреть сообщение
БД - хранилища структурированных данных.
жирным выделена деталь реализации конкретной БД.
а эти детали - не принципиальны.

Добавлено через 5 минут
Цитата Сообщение от Renji Посмотреть сообщение
А за "объединять их в единую структуру" при использовании БД надо бить по рукам.
я работаю с несколькими базами: MSSQLSERVER, PostgresSQL

при этом существует БД, которая предназначена для локальной работы
(хранилище размещается в оперативной памяти).

и существуют различные архивы: представления данных.
например: xml.
благодаря архивам можно например,
легко и просто перегнать всю базу целиком из MSSQLSERVER в PostgreSQL,
и обратно.

то бишь, xml здесь выступает в качестве некого "унифицированного" представления данных,
с которыми умеют работать все, поддерживаемые компанией базы.

при этом внутренняя структура конкретного представления
(будь то xml, или хранилище PostgresSQL) не имеет значения.

она у разных баз своя собственная, и не зависит от окружения.

в связи с этим, я нахожу ваш тезис безосновательным.

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
Нормальные БД поддерживают такие плюшки как атомарность и транзакции. То есть, если во время записи свет мигнул, база скорее всего не превратится в кашу. Чего, я так полагаю, нельзя сказать о Бусте и прочих велосипедах.
сравнивать механизм сериализации с БД - это все равно, что сравнивать теплое с мягким.
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
03.07.2015, 01:26 #13
Цитата Сообщение от hoggy Посмотреть сообщение
жирным выделена деталь реализации конкретной БД.
Деталь реализации любой нормальной БД. БД способная хранить лишь бесформенный ком binary данных, это что-то из каменного века, непонятно зачем нужное.
Цитата Сообщение от hoggy Посмотреть сообщение
благодаря архивам можно например,
легко и просто перегнать всю базу целиком из MSSQLSERVER в PostgreSQL,
и обратно.
Напоминаю, ТС спрашивал в чем ему хранить данные игрушки, а не как перегнать базу из MSSQLSERVER в PostgreSQL. Данные игрушки хранятся чтобы их читать, искать и редактировать, а не чтобы в PostgreSQL перегонять.
0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
03.07.2015, 01:34 #14
Цитата Сообщение от Renji Посмотреть сообщение
Деталь реализации любой нормальной БД.
мне не очень интересно, какие БД вы полагаете нормальными, а какие нет.

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


Цитата Сообщение от Renji Посмотреть сообщение
Напоминаю, ТС спрашивал в чем ему хранить данные игрушки, а не как перегнать базу из MSSQLSERVER в PostgreSQL.
это - излишнее напоминание.
итак понятно, что раз у ТС такие вопросы,
значит PostgreSQL ему сейчас точно не нужен.

а вот сериализация понадобится по любому,
если игрушка чутка сложнее тетриса.
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
03.07.2015, 01:44 #15
Цитата Сообщение от hoggy Посмотреть сообщение
базы случаются разными.
Реляционными, иерархическими, etc. Все они структурируют данные внутри себя, разница лишь в способе.
Цитата Сообщение от hoggy Посмотреть сообщение
а вот сериализация понадобится по любому,
если игрушка чутка сложнее тетриса.
Не понадобится, так как уже упрятана в недра СУБД. И да, программы использующие SQLite, тянут за собой и СУБД.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 01:44
Привет! Вот еще темы с ответами:

Оконный менеджер. Как лучше хранить указатели на элементы менеджера? - C++
Привет! Делаю тут 3D движок :wizard: В общем есть главный класс движка mgeSystem, так же есть класс окна mgeWindow, который не...

В каком формате экспортировать модель персонажа со скелетом? Как это грузить в игру? - C++
В игре предполагается скелетная анимация, но не готовые движения, сохранённые в последовательные 3D кадры, а с расчётом кинематики в самой...

На каком с++ лучше начать писать? - C++
Здравствуйте. Я не особо разбираюсь в с++. Но написав одну из своих первых программ на C++/cli столкнулся с крешами из-за фреймврока на...

Можно ли хранить файл с текстом в ресурсах приложения - C++
Здравствуйте. Если мне нужно подгрузить большой (ну скажем, предложений 10-15) текст, то как лучше поступить? Можно, кончено, считать при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.07.2015, 01:44
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru