Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/26: Рейтинг темы: голосов - 26, средняя оценка - 4.65
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
1

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

25.11.2013, 10:58. Показов 5108. Ответов 57
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть база данных в формате .dat
есть файл с структурами и типами в формате .h

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

Добавлено через 36 минут
формат .data... прошу прощение
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2013, 10:58
Ответы с готовыми решениями:

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

Создать текстовый файл из 5 строк, прочитать созданный файл и получить новый файл согласно своему варианту. Dev C++
8)В новом файле заменить все латинские буквы верхнего регистра на буквы нижнего регистра.

Типизированный файл с базой данных!
ПОМОГИТЕ ПОЖАЛУЙСТА найти ошибки в программе. ОЧЕНЬ НУЖНО К ЗАВТРАШНЕМУ ДНЮ!!! Составить...

После разделения базы данных не открывается файл с базой таблиц
Упёрся в стену. Помогите. Разделил базу на таблицы и формы и после этого Access не даёт открыть...

57
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 13:29 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от newbie666 Посмотреть сообщение
после чтения кол-ва байт, равным размеру твоей структуры у тебя указатель в потоке уже стоит дальше, тоесть при следующем чтении ты будешь читать уже другую структуру
Нужно только добавить: если в файл записаны структуры одинакового размера. А тут разве так?

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

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

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

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

Цитата Сообщение от alsav22 Посмотреть сообщение
Нужно только добавить: если в файл записаны структуры одинакового размера. А тут разве так?
а тут ему походу не в цикле надо будет сотню своих РАЗНЫХ структур читать, а каждую по отдельности
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
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... не учитывая структуры в структуре
что можете посоветовать?
0
Заблокирован
26.11.2013, 13:49 46
Цитата Сообщение от lips Посмотреть сообщение
всего 163 структуры...


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


В общем тебе надо сначала распарсить твой H файл со структурами, загнать всё это в вектор и на основании всё этого читать твой бинарник и потом заполнять лист бокс, но это такой геморой ......
тоесть мне надо загнать Н файл в массив вектор? а дальше то как я буду это использовать?
если не сложно можете пример какойнибудь накидать?
0
Заблокирован
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 структуры грузи по одной штуке, если тебе конечно вообще это надо
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
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 для визуалки вроде бы тока? я на рад студии сижу плотнинька
0
Заблокирован
26.11.2013, 14:11 51
архитектора этой галимотьи - с работы на помойку с приклеенной в тихоря на спине табличкой ВАЛЕНОК

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

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

Добавлено через 48 секунд
одинаковое - только первое поле бугага, а остальные - это ваше куча мусора какая то ....
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
26.11.2013, 14:12 52
Цитата Сообщение от lips Посмотреть сообщение
только что разобрался... перед началом чтения структуры из файла нужно прочитать интовое значение оно и будет являтся размером структуры
В чём разбирательство заключалось? Как узнали эту информацию?
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
26.11.2013, 14:14  [ТС] 53
Цитата Сообщение от newbie666 Посмотреть сообщение
так что все 163 структуры грузи по одной штуке
я себе представляю это так:
ставлю указатель на структуры... потом как то узнаю сколько полей у структуры на которой стоит указатель
потом получаю типы полей у этой структуры... в стринговом массиве... и потом снова указателем на структуру перебираю все поля учитывая их размер (из стрингового массива)
как вам такая идея?
но вообще возможно ли поставить указатель на эти структуры?
0
Заблокирован
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, - это будет размер массива и тд и тп и это только для маленького кусочка....

В таких случаях шлют нахрен разработчика твоих входных данных и требуют с него качественную работу
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
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, - это будет размер массива и тд и тп и это только для маленького кусочка....

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

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

И где вы взяли эту "прелесть"? Тут требуется не столько парсинг, сколько реверсинг.
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
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];
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 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. Правильно было бы найти (или рассчитать) это значение по данным из заголовка (файла).
0
26.11.2013, 16:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2013, 16:58
Помогаю со студенческими работами здесь

Как в программе можно открыть файл, с уже готовой базой данных в Access
Скажите как в программе можно открыть файл, с уже готовой базой данных в Access

Путь к базе данных MySQL, или где собака (файл с базой) зарыт
Добрый день. Опять я. Только вот вопрос у меня теперь совершенно идиотский: Qt и MySQL я...

Как прочитать xml файл из внешнего источника и на основе полученных данных сформировать HTML таблицы?
Дана задача, нужно по API получить листы с сервера, найти среди них с подтверждением(DoubleOptIn) и...

Прочитать файл данных (формата TSV) и подсчитать для каждого класса средний рост учащихся
Дан файл с таблицей в формате TSV с информацией о росте школьников разных классов. Напишите...


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

Или воспользуйтесь поиском по форуму:
58
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru