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

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

Восстановить пароль Регистрация
 
 
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
02.07.2015, 19:36     В каком формате лучше хранить историю работы приложения? #1
Подскажите, в чем обычно хранят данные различные игры под windows, которые не онлайн? Просто в бинарных файлах своей структуры без баз данных?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2015, 19:36     В каком формате лучше хранить историю работы приложения?
Посмотрите здесь:

Как лучше всего хранить коэффициенты? C++
В каком месте кода надо прятать окно приложения при старте? C++
Можно ли хранить файл с текстом в ресурсах приложения C++
Задача на алгоритм Дейкстры (как лучше хранить информацию?) C++
C++ В каком формате экспортировать модель персонажа со скелетом? Как это грузить в игру?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sergash
0 / 0 / 0
Регистрация: 23.06.2015
Сообщений: 2
02.07.2015, 20:22     В каком формате лучше хранить историю работы приложения? #2
Это смотря где. Некоторые используют базы данных, но зачастую используется какие нибудь велосипедные бинарные форматы.
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
02.07.2015, 20:41  [ТС]     В каком формате лучше хранить историю работы приложения? #3
а может подскажите, что проще использовать? вообще говоря нужжно обмениваться информацией с сервером(иногда, условно загрузка обновленных данных и передача некоторых результатов) и хранить историю работы приложения
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
02.07.2015, 20:53     В каком формате лучше хранить историю работы приложения? #4
Цитата Сообщение от klynxe Посмотреть сообщение
Просто в бинарных файлах своей структуры без баз данных?
базы данных это и есть "бинарные файлы со своей структурой".

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

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

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

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

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

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

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

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

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

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

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


сериализаторы типа boost.serialization
позволяют удобным и простым способом извлекать данные из объектов различных классов,
и объединять их в единую структуру:
бинарный файл, xml/json, и тп представления.
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
03.07.2015, 00:45  [ТС]     В каком формате лучше хранить историю работы приложения? #8
Цитата Сообщение от hoggy Посмотреть сообщение
сериализаторы типа boost.serialization
позволяют удобным и простым способом извлекать данные из объектов различных классов,
и объединять их в единую структуру:
бинарный файл, xml/json, и тп представления.
То есть сериализаторы используются для компоновки данных и далее готовые данные записываются в БД или файл?
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
03.07.2015, 01:00     В каком формате лучше хранить историю работы приложения? #9
Цитата Сообщение от hoggy Посмотреть сообщение
БД - базы данных.
хранилища информации,
ориентированные на её быстрый поиск,
и возможность подключаться одновременно нескольким клиентам.
БД - хранилища структурированных данных. Представляет собой массивы однотипных структур (таблиц), с наперед заданным типом полей. А за "объединять их в единую структуру" при использовании БД надо бить по рукам.
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 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;
}
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
03.07.2015, 01:12     В каком формате лучше хранить историю работы приложения? #11
Цитата Сообщение от klynxe Посмотреть сообщение
Ну и напоследок, есть ли какие-то критерии, когда лучше БД типа SQLite, а когда Serialization - Boost?
Нормальные БД поддерживают такие плюшки как атомарность и транзакции. То есть, если во время записи свет мигнул, база скорее всего не превратится в кашу. Чего, я так полагаю, нельзя сказать о Бусте и прочих велосипедах. Плюс, велосипед может оказаться весьма чувствителен к смене формата типа "добавили одно поле в сохраняемую структуру". С другой стороны, велосипед накодить значительно проще чем мучаться с SQL запросами. А то что при "свет мигнут" грохнется файл с сохранением, ну это не так страшно. Сейв - не готовой отчет бухгалтерии.
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
03.07.2015, 01:18     В каком формате лучше хранить историю работы приложения? #12
Цитата Сообщение от Renji Посмотреть сообщение
БД - хранилища структурированных данных.
жирным выделена деталь реализации конкретной БД.
а эти детали - не принципиальны.

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

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

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

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
Нормальные БД поддерживают такие плюшки как атомарность и транзакции. То есть, если во время записи свет мигнул, база скорее всего не превратится в кашу. Чего, я так полагаю, нельзя сказать о Бусте и прочих велосипедах.
сравнивать механизм сериализации с БД - это все равно, что сравнивать теплое с мягким.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
03.07.2015, 01:26     В каком формате лучше хранить историю работы приложения? #13
Цитата Сообщение от hoggy Посмотреть сообщение
жирным выделена деталь реализации конкретной БД.
Деталь реализации любой нормальной БД. БД способная хранить лишь бесформенный ком binary данных, это что-то из каменного века, непонятно зачем нужное.
Цитата Сообщение от hoggy Посмотреть сообщение
благодаря архивам можно например,
легко и просто перегнать всю базу целиком из MSSQLSERVER в PostgreSQL,
и обратно.
Напоминаю, ТС спрашивал в чем ему хранить данные игрушки, а не как перегнать базу из MSSQLSERVER в PostgreSQL. Данные игрушки хранятся чтобы их читать, искать и редактировать, а не чтобы в PostgreSQL перегонять.
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
03.07.2015, 01:34     В каком формате лучше хранить историю работы приложения? #14
Цитата Сообщение от Renji Посмотреть сообщение
Деталь реализации любой нормальной БД.
мне не очень интересно, какие БД вы полагаете нормальными, а какие нет.

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


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

а вот сериализация понадобится по любому,
если игрушка чутка сложнее тетриса.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
03.07.2015, 01:44     В каком формате лучше хранить историю работы приложения? #15
Цитата Сообщение от hoggy Посмотреть сообщение
базы случаются разными.
Реляционными, иерархическими, etc. Все они структурируют данные внутри себя, разница лишь в способе.
Цитата Сообщение от hoggy Посмотреть сообщение
а вот сериализация понадобится по любому,
если игрушка чутка сложнее тетриса.
Не понадобится, так как уже упрятана в недра СУБД. И да, программы использующие SQLite, тянут за собой и СУБД.
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
03.07.2015, 02:09     В каком формате лучше хранить историю работы приложения? #16
Цитата Сообщение от Renji Посмотреть сообщение
Реляционными, иерархическими, etc. Все они структурируют данные внутри себя, разница лишь в способе.
не нужно объяснять мне то, что я итак знаю.

я вам ещё раз повторяю:
детали реализации конкретных баз не принципиальны.

Цитата Сообщение от Renji Посмотреть сообщение
Не понадобится, так как уже упрятана в недра СУБД.
вы похоже не осознаете о чем речь.

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

нужно сохранить данные.

как именно вы предлагаете извлекать данные из объектов,
и скармливать их front-end базы данных?

СУБД ничего не знает про ваши бизнес-классы, и объекты.
она знает только о своим собственном представлении данных,
и больше ни о чем.

она вообще не подозревает о существовании какой то там игрушки.


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

вы конечно можете делать это каждый раз вручную,
и затрачивать на эту рутину кучу времени.

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

и сможет формировать данные любых объектов независимо от их сложности.

сериализатор не обязательно должен запихивать данные
в plain-text/binary/xml/json файлы.

с тем же успехом,
он может накормить данными front-end библиотеку конкретной базы данных.

и я вам ещё раз, и в последний раз делаю замечание:
детали реализации конкретной СУБД не принципиальны.

совершенно не важно,
как конкретная СУБД сериализует/десереализует свои данные.
это не имеет никакого отношения к бизнес-проекту (игрушке) пользователя.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
03.07.2015, 03:55     В каком формате лучше хранить историю работы приложения? #17
Цитата Сообщение от hoggy Посмотреть сообщение
представьте себе: есть некий проект.
у него есть некая оопнутая архитектура.
В памяти. А на диске у него кортеж "тип юнита/координаты/очки жизни" и больше ничего. И сериализация там, как собаке пятая нога. Впрочем, БД тоже по большей части для понту. Напоминаю, мы говорили о игре, а не базе знаний ИИ.
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
03.07.2015, 11:50     В каком формате лучше хранить историю работы приложения? #18
Цитата Сообщение от Renji Посмотреть сообщение
А на диске у него кортеж "тип юнита/координаты/очки жизни" и больше ничего. И сериализация там, как собаке пятая нога.
а это и есть сериализация, если что.
вот этот ваш кортеж на диске - продукт сериализации.

сериализация - процедура преобразования объекта
в некий формат по некоторым правилам.

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

пример:
если вы написали дружественную функцию,
которая выводит состояние объекта в std::cout,
то вы написали сериализацию для вывода в поток std::cout.

просто её делать можно по уму (см boost.serialization/cereal),
и поиметь кучу профита:
писать минимум кода,
возможность выбирать любые архивы,
конвертировать данные из одного формата в другой, и тп.


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

Цитата Сообщение от Renji Посмотреть сообщение
Напоминаю, мы говорили о игре, а не базе знаний ИИ.
зачем вы напоминаете мне об одном и том же?
я же вам уже написал выше:

это - излишнее напоминание.
итак понятно, что раз у ТС такие вопросы,
значит PostgreSQL ему сейчас точно не нужен.
а вот сериализация понадобится по любому,
если игрушка чутка сложнее тетриса.
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
03.07.2015, 15:09  [ТС]     В каком формате лучше хранить историю работы приложения? #19

Не по теме:

hoggy, Renji, Хорошо бы какую-нибудь статью в раздел "Visual C++ и базы данных" с сравнением БД и полезными ссылками, думаю такие вопросы ни у одного меня возникают



Добавлено через 1 час 15 минут
Renji, может подскажите пару ссылок как подключить SQLite к проекту C++ на windows ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 15:15     В каком формате лучше хранить историю работы приложения?
Еще ссылки по теме:

C++ В каком виде хранить двоичные числа
Оконный менеджер. Как лучше хранить указатели на элементы менеджера? C++
C++ Перегрузка ifstream и ofstream для работы с файлами в little-endian формате?

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

Или воспользуйтесь поиском по форуму:
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
03.07.2015, 15:15     В каком формате лучше хранить историю работы приложения? #20
Цитата Сообщение от hoggy Посмотреть сообщение
в более точной формулировке:
процедура преобразования объектов в некую последоватольность байт по некоторым правилам.
Какие еще преобразования в последовательность? INSERT INTO my_table VALUES ("peasant",1,2,3);, дальнейшая судьба объектов - не моя проблема. В особо ленивом случае, вообще единственный stream.write, который ничего не преобразует, пишет как есть. Сериализация же - именно преобразование как минимум в пары "имя поля:значение". Иначе это профанация одна (любое расширение формата файла, сделает его нечитаемым).
Цитата Сообщение от klynxe Посмотреть сообщение
Renji, может подскажите пару ссылок как подключить SQLite к проекту C++ на windows ?
Я его только под пингвинами щупал.
Yandex
Объявления
03.07.2015, 15:15     В каком формате лучше хранить историю работы приложения?
Ответ Создать тему
Опции темы

Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru