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

Способ прочитать файл с базой данных - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
25.11.2013, 10:58     Способ прочитать файл с базой данных #1
есть база данных в формате .dat
есть файл с структурами и типами в формате .h

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

Добавлено через 36 минут
формат .data... прошу прощение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2013, 10:58     Способ прочитать файл с базой данных
Посмотрите здесь:

Работа с базой данных C++
Данные записать в файл F1.txt, затем прочитать оттуда, обрабатывались и записывались в бинарный файл F2.bin с проверкой C++
C++ самый короткий способ открыть файл
C++ Способ вывода данных на экран
C++ как можно прочитать файл в обратном порядке т.е. стать в конец файла и прочитать до начальной позиции?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 13:29     Способ прочитать файл с базой данных #41
Цитата Сообщение от newbie666 Посмотреть сообщение
после чтения кол-ва байт, равным размеру твоей структуры у тебя указатель в потоке уже стоит дальше, тоесть при следующем чтении ты будешь читать уже другую структуру
Нужно только добавить: если в файл записаны структуры одинакового размера. А тут разве так?

Добавлено через 4 минуты
Для таких дел нужно: или точно знать формат записи в файл, или код, которым этот файл создавался.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
26.11.2013, 13:33  [ТС]     Способ прочитать файл с базой данных #42
Цитата Сообщение от newbie666 Посмотреть сообщение
Ну ты понимаешь, что такое файловый поток?
Вот смотри, ты открыл файл файловым потоком fstream, у тебя в потоке все данные файла и указатель текущей позиции на нуле, то есть, например, ты открыл поток с каким то содержанием и у тебя получилась вот такая кишка:
1234567890ABCDF и тд, это байты или данные какие то твои в потоке,
после того, как ты оттуда прочитал например 3 байта, у тебя в потоке осталось:
4567890ABCDF, тоесть первый 3 байта, 123 - уже считались, после того, как они считались, у тебя указатель перемещается автоматом как бы дальше понимаешь?

то есть после команды fs.read((char*)&item, sizeof(item));, где item = твоя структура, ты из потока прочитаешь ровно столько байт, сколько твоя структура в потоке занимала, тоесть

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

Добавлено через 3 минуты
только что разобрался... перед началом чтения структуры из файла нужно прочитать интовое значение оно и будет являтся размером структуры
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 13:34     Способ прочитать файл с базой данных #43
Цитата Сообщение от lips Посмотреть сообщение
только что разобрался... перед началом чтения структуры из файла нужно прочитать интовое значение оно и будет являтся размером структуры
Тогда другое дело.
newbie666
Заблокирован
26.11.2013, 13:39     Способ прочитать файл с базой данных #44
Цитата Сообщение от lips Посмотреть сообщение
перед началом чтения структуры из файла нужно прочитать интовое значение оно и будет являтся размером структуры
это нормальная практика, когда сначала в бинарнике идёт размер следующего блока, а потом сам блок, т.к. размер блока, если он состоит не из простых типов данных, размер которых известен заранее (типа char, bool ...), может меняться, например у тебя сохранена в блоке строка, а хрен его знает, какой она длинны - для этого размер и загоняют в бинарник

Цитата Сообщение от alsav22 Посмотреть сообщение
Нужно только добавить: если в файл записаны структуры одинакового размера. А тут разве так?
а тут ему походу не в цикле надо будет сотню своих РАЗНЫХ структур читать, а каждую по отдельности
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
26.11.2013, 13:45  [ТС]     Способ прочитать файл с базой данных #45
ещё 2 не решенных вопроса:
как мне в листбокс записать название структур? которые у меня в .h фале
можно ли в стринг грид выводить нужную структуру НЕ писав при этом каждый раз что то типо такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    
        StringGrid1->RowCount = size_struct; 
    StringGrid1->ColCount = 7; //количество полей у структуры
    for(int i=0;i<size_struct;i++)
    {
        StringGrid1->Cells[0][i+1] = item[i].id;
        StringGrid1->Cells[1][i+1] = item[i].name;
        StringGrid1->Cells[2][i+1] = item[i].type;
        StringGrid1->Cells[3][i+1] = item[i].num_params;
        StringGrid1->Cells[4][i+1] = item[i].param1;
        StringGrid1->Cells[5][i+1] = item[i].param2;
        StringGrid1->Cells[6][i+1] = item[i].param3;
    }
всего 163 структуры... полей в каждой может быть от 5 до 50... не учитывая структуры в структуре
что можете посоветовать?
newbie666
Заблокирован
26.11.2013, 13:49     Способ прочитать файл с базой данных #46
Цитата Сообщение от lips Посмотреть сообщение
всего 163 структуры...


В общем тебе надо сначала распарсить твой H файл со структурами, загнать всё это в вектор и на основании всё этого читать твой бинарник и потом заполнять лист бокс, но это такой геморой ......
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 13:52     Способ прочитать файл с базой данных #47
Цитата Сообщение от lips Посмотреть сообщение
ещё 2 не решенных вопроса:
У меня ещё один: размер струкутуры записан в файле перед каждой структурой. Так? А название структуры? Мало знать размер, ещё нужно знать какая это структура, чтобы знать порядок полей в ней (иначе, как выводить структуру?). В файле есть информация об этом?
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
26.11.2013, 13:54  [ТС]     Способ прочитать файл с базой данных #48
Цитата Сообщение от newbie666 Посмотреть сообщение


В общем тебе надо сначала распарсить твой H файл со структурами, загнать всё это в вектор и на основании всё этого читать твой бинарник и потом заполнять лист бокс, но это такой геморой ......
тоесть мне надо загнать Н файл в массив вектор? а дальше то как я буду это использовать?
если не сложно можете пример какойнибудь накидать?
newbie666
Заблокирован
26.11.2013, 14:08     Способ прочитать файл с базой данных #49
вот честно тебе скажу, я задолбался на этой ветке по сто раз один и тот же код писать, как открыть текстовой файл так что примера не будет

Ну вот смотри, ты понимаешь, что у тебя в бинарнике все 163 структуры разного размера. То есть тебе надо задействовать какую - то автоматизацию, чтоб не объявлять в программе 163 структуры и 163 структуры по одной читать ...

Уточни, какая конечная цель твоей работы (лист бокс или что) , что в итоге надо получить

Добавлено через 1 минуту
у тебя вот эти поля обязательные в каждой структуре ?
StringGrid1->Cells[0][i+1] = item[i].id;
StringGrid1->Cells[1][i+1] = item[i].name;
StringGrid1->Cells[2][i+1] = item[i].type;
StringGrid1->Cells[3][i+1] = item[i].num_params;
StringGrid1->Cells[4][i+1] = item[i].param1;

? Тоесть первые четыре полюбому и обязательно как минимум один параметр ?

Добавлено через 38 секунд
ты что на MFC хреначишь ? )))))

Добавлено через 7 минут
посмотрел на Н файл с описанием структур - бред сивой кобылы, вот без обид, можешь выкинуть это барахло на помойку и сказать тому, кто это сохранял в файл - что он не хороший человек

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

C++
1
2
3
4
struct MEDICINE_MAJOR_TYPE {
    uint id;
    wchar_t name[32];
};
а тут уже другое:

C++
1
2
3
4
5
6
7
8
9
10
11
12
struct RECIPE_ESSENCE {
    uint id;
    uint id_major_type;
    uint id_sub_type;
    wchar_t name[32];
    int level;
    uint b_produce_special_items_pack;
    int id_special_items_pack;
    struct {
        float probability;
        uint id_to_make;
........
так что все 163 структуры грузи по одной штуке, если тебе конечно вообще это надо
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
26.11.2013, 14:08  [ТС]     Способ прочитать файл с базой данных #50
Цитата Сообщение от newbie666 Посмотреть сообщение
вот честно тебе скажу, я задолбался на этой ветке по сто раз один и тот же код писать, как открыть текстовой файл так что примера не будет

Ну вот смотри, ты понимаешь, что у тебя в бинарнике все 163 структуры разного размера. То есть тебе надо задействовать какую - то автоматизацию, чтоб не объявлять в программе 163 структуры и 163 структуры по одной читать ...

Уточни, какая конечная цель твоей работы (лист бокс или что) , что в итоге надо получить

Добавлено через 1 минуту
у тебя вот эти поля обязательные в каждой структуре ?
StringGrid1->Cells[0][i+1] = item[i].id;
StringGrid1->Cells[1][i+1] = item[i].name;
StringGrid1->Cells[2][i+1] = item[i].type;
StringGrid1->Cells[3][i+1] = item[i].num_params;
StringGrid1->Cells[4][i+1] = item[i].param1;

? Тоесть первые четыре полюбому и обязательно как минимум один параметр ?

Добавлено через 38 секунд
ты что на MFC хреначишь ? )))))
только первые 2 поля одинаковые... id, name
mfc для визуалки вроде бы тока? я на рад студии сижу плотнинька
newbie666
Заблокирован
26.11.2013, 14:11     Способ прочитать файл с базой данных #51
архитектора этой галимотьи - с работы на помойку с приклеенной в тихоря на спине табличкой ВАЛЕНОК

Добавлено через 57 секунд
Цитата Сообщение от lips Посмотреть сообщение
только первые 2 поля одинаковые
даже первые два далеко не везде одинаковые

MFC - галяк, для вузаулки на простом WinAPI пиши, если конечно не знаешь Qt

Добавлено через 48 секунд
одинаковое - только первое поле бугага, а остальные - это ваше куча мусора какая то ....
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 14:12     Способ прочитать файл с базой данных #52
Цитата Сообщение от lips Посмотреть сообщение
только что разобрался... перед началом чтения структуры из файла нужно прочитать интовое значение оно и будет являтся размером структуры
В чём разбирательство заключалось? Как узнали эту информацию?
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
26.11.2013, 14:14  [ТС]     Способ прочитать файл с базой данных #53
Цитата Сообщение от newbie666 Посмотреть сообщение
так что все 163 структуры грузи по одной штуке
я себе представляю это так:
ставлю указатель на структуры... потом как то узнаю сколько полей у структуры на которой стоит указатель
потом получаю типы полей у этой структуры... в стринговом массиве... и потом снова указателем на структуру перебираю все поля учитывая их размер (из стрингового массива)
как вам такая идея?
но вообще возможно ли поставить указатель на эти структуры?
newbie666
Заблокирован
26.11.2013, 14:19     Способ прочитать файл с базой данных #54
Цитата Сообщение от lips Посмотреть сообщение
ставлю указатель на структуры... потом как то узнаю сколько полей у структуры в
потом получаю типы полей у этой структуры... в стринговом массиве... и потом снова указателем на структуру перебираю все поля учитывая их размер (из стрингового массива)
как вам такая идея?
тебе нужно будет конкретно с парсером корячется, т.к. у тебя в структурах и строки и массивы и везде по разному ухаха

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct MEDICINE_ESSENCE {
    uint id;
    uint id_major_type;
    uint id_sub_type;
    wchar_t name[32];
    int item_quality;
    wchar_t simple_desc[16];
    int file_matter;
    int file_icon;
    int require_level;
    uint cool_type_mask;
    int cool_time_world;
    int cool_time_instance;
    int use_area_mask;
    int type;
    int hp_max;
    int mp_max;
    int hp[4];
    int mp[4];
    int vp[4];
    int physique_add;
Ты представляешь как это? Типа ты ишешь в файле структуру, ну ладно - ты её нашёл, берёшь новую строку, если в ней есть три буквы int ты читаешь по чарово дальше, если нашёл [ - значит это массив, читаешь дальше до ], все эти чары сохраняешь в строковый поток - перегоняешь в int, - это будет размер массива и тд и тп и это только для маленького кусочка....

В таких случаях шлют нахрен разработчика твоих входных данных и требуют с него качественную работу
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
26.11.2013, 14:24  [ТС]     Способ прочитать файл с базой данных #55
Цитата Сообщение от alsav22 Посмотреть сообщение
В чём разбирательство заключалось? Как узнали эту информацию?
посмотрел данные в файле после
Цитата Сообщение от gazlan Посмотреть сообщение
0x87
Добавлено через 3 минуты
Цитата Сообщение от newbie666 Посмотреть сообщение
тебе нужно будет конкретно с парсером корячется, т.к. у тебя в структурах и строки и массивы и везде по разному ухаха

struct MEDICINE_ESSENCE {
uint id;
uint id_major_type;
uint id_sub_type;
wchar_t name[32];
int item_quality;
wchar_t simple_desc[16];
int file_matter;
int file_icon;
int require_level;
uint cool_type_mask;
int cool_time_world;
int cool_time_instance;
int use_area_mask;
int type;
int hp_max;
int mp_max;
int hp[4];
int mp[4];
int vp[4];
int physique_add;


Ты представляешь как это? Типа ты ишешь в файле структуру, ну ладно - ты её нашёл, берёшь новую строку, если в ней есть три буквы int ты читаешь по чарово дальше, если нашёл [ - значит это массив, читаешь дальше до ], все эти чары сохраняешь в строковый поток - перегоняешь в int, - это будет размер массива и тд и тп и это только для маленького кусочка....

В таких случаях шлют нахрен разработчика твоих входных данных и требуют с него качественную работу
ну почему же так критично, я же первую структуру прочитал целиком... без заморочек... просто надо было понять структуру бинарного файла... что после чего читать... где размер а где заголовок....
вообщем спасибо всем за помощь!!!
gazlan
2867 / 1815 / 272
Регистрация: 27.08.2010
Сообщений: 4,921
Записей в блоге: 1
26.11.2013, 15:58     Способ прочитать файл с базой данных #56
Гм. 296 вхождений слова struct в .H-файле. Вам, почему-то, нужен этот разбор? Работы не на один день...

При этом нет описания заголовка файла, то есть, нет разбивки по страницам или иного соответствия структур данным. Возможно, тип структуры определяется по ID, но этой информации тоже нет.

И где вы взяли эту "прелесть"? Тут требуется не столько парсинг, сколько реверсинг.
lips
2 / 2 / 0
Регистрация: 03.01.2012
Сообщений: 283
26.11.2013, 16:31  [ТС]     Способ прочитать файл с базой данных #57
Цитата Сообщение от gazlan Посмотреть сообщение
Гм. 296 вхождений слова struct в .H-файле. Вам, почему-то, нужен этот разбор? Работы не на один день...

При этом нет описания заголовка файла, то есть, нет разбивки по страницам или иного соответствия структур данным. Возможно, тип структуры определяется по ID, но этой информации тоже нет.

И где вы взяли эту "прелесть"? Тут требуется не столько парсинг, сколько реверсинг.
мой курсовой проект

хочу расширить массив подскажите где косяк?
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
struct EQUIPMENT_ADDON {
    int id;
    wchar_t name[32];
    int type;
    int num_params;
    int param1;
    int param2;
    int param3;
};
 
EQUIPMENT_ADDON *item = new EQUIPMENT_ADDON[0]; //тот самый массив
 
 
main()//образно
{
        int size_arr;
        std::fstream fs(L"lib//elements.data", std::ios::in | std::ios::binary);
        if(fs.is_open())
    {
        fs.seekg(140, ios_base::beg); //пропускаем ненужное
        fs.read((char*)&size_arr, sizeof(int)); //сколько будет таблиц
        item = (EQUIPMENT_ADDON*)malloc(size_arr*sizeof(EQUIPMENT_ADDON)); //увеличиваем размер до нужного
        fs.read((char*)&item, sizeof(item));//пытаемся прочитать структуру
        fs.close();
    }
        Form1->Caption = item[0].id;//тут программа вылетает
}
Добавлено через 2 минуты
а вот если так, то всё норм
C++
1
2
3
4
5
6
7
8
9
struct EQUIPMENT_ADDON {
    int id;
    wchar_t name[32];
    int type;
    int num_params;
    int param1;
    int param2;
    int param3;
}item[7159];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2013, 16:58     Способ прочитать файл с базой данных
Еще ссылки по теме:

составить программу,которая создает файл, состоящий из 10 значений типа int. прочитать файл и вычислить сумму его элементов C++
Открыть файл, прочитать. Все, что находится после двоеточия перенести в другой файл C++
C++ Прочитать файл

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

Или воспользуйтесь поиском по форуму:
gazlan
2867 / 1815 / 272
Регистрация: 27.08.2010
Сообщений: 4,921
Записей в блоге: 1
26.11.2013, 16:58     Способ прочитать файл с базой данных #58
Цитата Сообщение от lips Посмотреть сообщение
Form1
Про "формы" ничего не знаю. И, вообще, отлаживать парсинг надо в консоли.

fs.seekg
IMHO, глупость. Проще и удобнее всего работать через Memory Mapping - даже с "потоковыми" форматами.

malloc
new уже отменили? В этом месте у вас утечка памяти, потому что new EQUIPMENT_ADDON[0] все еще требует парного delete[].

И, наконец, size_arr, возможно, слишком велик для malloc.

7159 получилось, потому что я читал подряд до нулевого ID. Правильно было бы найти (или рассчитать) это значение по данным из заголовка (файла).
Yandex
Объявления
26.11.2013, 16:58     Способ прочитать файл с базой данных
Ответ Создать тему
Опции темы

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