Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
6 / 6 / 3
Регистрация: 04.10.2014
Сообщений: 138

Как вычитывать переменные с бинарного файла по-отдельности, не объявляя структур, а имея данные об их составе?

08.10.2014, 21:42. Показов 2365. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно сделать так, что бы программа могла брать из некого файла (*.cfg) структуру и обрабатывать её. Т.е. в самой программе не прописано:
C++
1
2
3
4
5
6
struct test {
int a;
int b;
float c;
wchar_t d;
};
и т.д., а она смотрела в этот файл (*.cfg) и видела, что мол там:
C++
1
int,int,float,wchar_t
значит предстоит юзать структуру такого вида. Знаю что это выполнимо, но даже в мысли не приходит как это можно сделать...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2014, 21:42
Ответы с готовыми решениями:

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

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

Чтение массива структур из бинарного файла
Доброго времени суток.Возникла проблема с чтением структур из бинарного файла.Файл открывает,но при считывании данных, сразу закрывается с...

32
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,411
Записей в блоге: 3
08.10.2014, 21:46
Работа с INI-файлами - то, что Вам надо
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.10.2014, 21:52
Цитата Сообщение от semihal Посмотреть сообщение
Т.е. в самой программе не прописано:
...
и т.д., а она смотрела в этот файл (*.cfg) и видела ...
Гм... вот этот момент надо хорошо-доходчиво пояснить. Лучше на пальцах.
0
6 / 6 / 3
Регистрация: 04.10.2014
Сообщений: 138
08.10.2014, 21:57  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Гм... вот этот момент надо хорошо-доходчиво пояснить. Лучше на пальцах.
Таак-с.
Допустим, у меня есть некий бинарный файл. Я его редактирую, сохраняю, всё хорошо. Но данные которые я вытаскиваю оттуда хранятся в виде структур. А так как есть структуры и по 200 переменных (о_о) то писать каждую структуру внутри программы (а их может быть порядка 100) - дело "такое". Поэтому гораздо легче, что бы эти самые "структуры" были описаны в каком то файле - допустим default.cfg. Главное преимущество этого: что в файле (default.cfg) их можно было редактировать. Т.е. ты убрал из бинарника одну переменную, то из файла взял и тоже ручками убил 1 переменную.

Другими словами: в default.cfg я пишу ему, мол я буду использовать 5 переменных типа int. И программа мне готовит 5 переменных типа Int, в которые я засуну какие-то данные. Потом отредактировал cfg и говорю, мол мне надо 3 int, 4 float и 1 wchar_t. И он мне готовит уже столько переменных в таких типах.

Надеюсь я понятно пояснил Но как сделать этого - ума не приложу..

Цитата Сообщение от D1973 Посмотреть сообщение
Работа с INI-файлами - то, что Вам надо
работу с текстовым/INI файлом организовать не так уж и сложно, но как сделать именно то, что я изложил выше.
0
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
08.10.2014, 23:13
Цитата Сообщение от semihal Посмотреть сообщение
работу с текстовым/INI файлом организовать не так уж и сложно, но как сделать именно то, что я изложил выше.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <IniFiles.hpp>
 
    TIniFile *ini = new TIniFile("C:\\config.ini");   //открываем файл с параметрами
 
    int ic = ini->ReadInteger("config", "intCount", 0);  //получаем количество переменных типа int, которые нужны
    int *ia = new int[ic];  //создаём динамический массив нужного размера
    
    for (int i = 0; i < ic; i++)  //в цикле используем элементы массива
        ia[i] = 1;  //здесь какое-то своё использование элемента массива
 
 
 
    int fc = ini->ReadFloat("config", "floatCount", 0);  //получаем количество переменных типа float, которые нужны
    float *fa = new float[fc];  //создаём динамический  массив нужного размера
 
    for (int i = 0; i < fc; i++)  //в цикле используем элементы массива
        fa[i] = 2.2;  //здесь какое-то своё использование элемента массива
 
    delete ini;
    ini = NULL;
 
    delete [] ia;
    delete [] fa;
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.10.2014, 23:17
Понятно. Хочется изменять формат чтения с бинарника во время выполнения и не задавать при этом все возможные типы структур.

Сдается мне, варианты есть, надо подумать только. Расскажи еще, как собираешься использовать добытые переменные? Пусть у них будут имена, значения, а типа они будут заранее непредсказуемого - как твоя программа узнает, что нужно делать с той или иной переменной? Есть какая-то типовая обработка, не зависящая от состава структуры в бинарнике?
0
6 / 6 / 3
Регистрация: 04.10.2014
Сообщений: 138
08.10.2014, 23:31  [ТС]
Lelik-pahan, не так всё просто. В одну функцию загрузки данных в массив из файла, редактирование, и т.д. не засунешь. А структура можед доходить до 100-150 переменных. Так не совсем вариант. Мне доступ нужен ко всем структурам почти одновременно.

Добавлено через 5 минут
Цитата Сообщение от BRcr Посмотреть сообщение
Сдается мне, варианты есть, надо подумать только. Расскажи еще, как собираешься использовать добытые переменные? Пусть у них будут имена, значения, а типа они будут заранее непредсказуемого - как твоя программа узнает, что нужно делать с той или иной переменной? Есть какая-то типовая обработка, не зависящая от состава структуры в бинарнике?
они в любом случае будут известного заранее типа, на это и есть эта самая структура. Там идут определённые данные подряд. Допустим идёт "1 элемент", он имеет подряд идущие данные: 4 байта Int, 60 байт wchar_t и ещё 4 байта int. Потом идёт следом ещё один элемент, с такой же "структурой". и такие элементов N количество.
Ну а так как таких структур (разных) может быть порядка 100-150. А таких подряд идущих элементов может быть от 7000 шт. То писать хотя бы каждую разновидность внутри программы - очень очень и очень неудобно, особенно если вдруг придется поменять структуру.

Просто я никогда с таким не связывался, поэтому прошу помощи.. Даже не знаю как и сделать. Просто массив данных - не вариант. Все эти структуры должны по сути быть в "реальном" режим. Т.е. переключил чекбокс допустим, и отображается уже 2-я а не 1-я структура.
0
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
08.10.2014, 23:31
Цитата Сообщение от semihal Посмотреть сообщение
Lelik-pahan, не так всё просто. В одну функцию загрузки данных в массив из файла, редактирование, и т.д. не засунешь. А структура можед доходить до 100-150 переменных. Так не совсем вариант. Мне доступ нужен ко всем структурам почти одновременно.
объяви указатели на структуры глобально и используй в разных функциях.
0
6 / 6 / 3
Регистрация: 04.10.2014
Сообщений: 138
08.10.2014, 23:36  [ТС]
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
объяви указатели на структуры глобально и используй в разных функциях.
А как можно перекинуть эти указатели допустим от Btn1 на Btn2? В VCL Forms Application C++ Builder такого не встречал вообще. А использовать 100-150 глобальных "переменных" такого типа - вроде как совсем не хорошо
0
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
08.10.2014, 23:41
Цитата Сообщение от semihal Посмотреть сообщение
А как можно перекинуть эти указатели допустим от Btn1 на Btn2? В VCL Forms Application C++ Builder такого не встречал вообще. А использовать 100-150 глобальных "переменных" такого типа - вроде как совсем не хорошо
объявляй указатели в h-файле, например в классе формы. Тогда ты сможешь использовать их использовать во всём cpp-файле, к которому подключен этот h-файл. Тогда можешь создавать массивы в одной функции, инициализировать их в другой, использовать - в третьей.


Самое важное - как ты будешь использовать эти данные, от этого зависит реализация. Постарайся объяснить конкретнее.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.10.2014, 23:46
Пусть в файлике описания структур есть запись где-то такого вида:
int_1; длина - 4
array_of_char1; длина - 60
int_2; длина - 4
double_1; длина - 8
some_type_1; длина - 225
Ну, прочитали мы информацию о формате, считали с файла, в неком виде сохранили. Вот оно все есть на руках - дальше что с этим богатством делаем? Что для нас значат эти абстрактные имена int_1, int_2?
0
6 / 6 / 3
Регистрация: 04.10.2014
Сообщений: 138
08.10.2014, 23:51  [ТС]
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
объявляй указатели в h-файле, например в классе формы. Тогда ты сможешь использовать их использовать во всём cpp-файле, к которому подключен этот h-файл. Тогда можешь создавать массивы в одной функции, инициализировать их в другой, использовать - в третьей.
Самое важное - как ты будешь использовать эти данные, от этого зависит реализация.
Так мне ж заранее не известно, сколько всего таких будет "структур". Т.е. я не знаю, сколько тех же указателей объявить. Допустим смотри, у меня будет 3 таких структуры:
C++
1
2
3
4
struct text1 {
int a;
int b;
wchar_t Name;
C++
1
2
3
4
5
6
struct text2 {
int a;
wchar_t Name;
int b;
int c;
int d;
C++
1
2
3
4
struct text3 {
wchar_t Name;
int a..v (от а, до v);
float fl;
С учётом того, что 1 чекбокс переключил у тебя отобразиться 1 структура, 2й чекбокс - 2я, и так с 3-ей (т.е. их просмотр в реальном времени). Плюс к тому же, я не знаю, мало ли будет 2, а не 3 структуры (в случае редактирования).

Добавлено через 1 минуту
Цитата Сообщение от BRcr Посмотреть сообщение
Пусть в файлике описания структур есть запись где-то такого вида:
int_1; длина - 4
array_of_char1; длина - 60
int_2; длина - 4
double_1; длина - 8
some_type_1; длина - 225
Ну, прочитали мы информацию о формате, считали с файла, в неком виде сохранили. Вот оно все есть на руках - дальше что с этим богатством делаем? Что для нас значат эти абстрактные имена int_1, int_2?
Дальше я их вывожу в StringGrid, что бы человек мог редактировать эти сами данные.
0
6 / 6 / 3
Регистрация: 04.10.2014
Сообщений: 138
08.10.2014, 23:55  [ТС]
Со скриншотом формы думаю понятнее будет
Миниатюры
Как вычитывать переменные с бинарного файла по-отдельности, не объявляя структур, а имея данные об их составе?  
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.10.2014, 00:13
Цитата Сообщение от semihal Посмотреть сообщение
Т.е. в самой программе не прописано:
Никак нельзя сделать, если рассматривать именно так как сформулировано.

Добавлено через 5 минут
Цитата Сообщение от semihal Посмотреть сообщение
А так как есть структуры и по 200 переменных (о_о)
В нормально программе такое исключено...
Цитата Сообщение от semihal Посмотреть сообщение
Поэтому гораздо легче, что бы эти самые "структуры" были описаны в каком то файле - допустим default.cfg. Главное преимущество этого: что в файле (default.cfg) их можно было редактировать. Т.е. ты убрал из бинарника одну переменную, то из файла взял и тоже ручками убил 1 переменную.
Используйте скриптовые язык, нафига мучать С++.
Цитата Сообщение от semihal Посмотреть сообщение
Ну а так как таких структур (разных) может быть порядка 100-150. А таких подряд идущих элементов может быть от 7000 шт.
Не может такого быть, в отличии о кривых рук...
0
6 / 6 / 3
Регистрация: 04.10.2014
Сообщений: 138
09.10.2014, 00:13  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Никак нельзя сделать, если рассматривать именно так как сформулировано.
Ну я имею ввиду в программе не будет прописано фиксированное количество структур и их эл-тов. Т.е. не вписывать в код все 150 структур по 150 переменных в каждой (образно)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.10.2014, 00:16
Что ты имеешь ввиду, не понять. Говори конечную цель!

То что ты сформулировал, никак может быть реализовано через структуры, ибо структуры заведомо фиксированы и должны быть объявлены.

Так что ты либо сам не понимаешь что тебе надо, либо тебе нужно забыть про С++ и использовать скриптовый язык, тогда не нужно будет перекомпиляция.
0
6 / 6 / 3
Регистрация: 04.10.2014
Сообщений: 138
09.10.2014, 00:17  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
В нормально программе такое исключено...
Понимаете. Это файл создавал не я, а китайцы. Я же делаю редактор этого самого файла. Всего около 100-150 структур, как минимум во второй структуре 183 переменные (183 значения, которые программа должна уметь редактировать).

Я ж вас уверяю, такое быть может. Столкнулся лично)) Если не верите, возьмите elements.data от Perfect World и тому подобных, и поймёте о чём я
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.10.2014, 00:22
У вас есть исходники Perfect World ?

Думаю нет, если есть то какие проблемы со структурами? Если нет откуда вы можете знаете сколько там структур и переменных?
0
6 / 6 / 3
Регистрация: 04.10.2014
Сообщений: 138
09.10.2014, 00:23  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Что ты имеешь ввиду, не понять. Говори конечную цель!
Мы открываем бинарный файл. В котором содержится овердофига значение. Бинарный файл так сказать делится на так называемые "листы". Эти листы собственно и состоят из этой структуры. Какой лист именно редактировать выбирает пользователь сам (в комбобоксе). Имена элементов этого листа отображаются в Лист боксе. Клик по элементу в боксе -> открывается более подробная информация по элементу со всеми значениями (в StringGrid), где мы их и редактируем. Но полльзователь в любой момент может выбрать любой другой лист (то бишь другую структуру уже для редактирования). После всех манипуляций, мы сохраняем всю эту байду в бинарник и всё. Вот весь смысл.

P.S. таких листов - 150+. То бишь 150 разных структур. Прописывать каждую в программе - ничего хорошего
0
6 / 6 / 3
Регистрация: 04.10.2014
Сообщений: 138
09.10.2014, 00:32  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Гениальный вывод ...
Цитата Сообщение от Avazart Посмотреть сообщение
У вас есть исходники Perfect World ?
Откуда Вам знать, имею я эти структуры или нет? Наверное я не ради прикола спросил, как сделать то или иное действие?

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Думаю нет, если есть то какие проблемы со структурами? Если нет откуда вы можете знаете сколько там структур и переменных?
Проблема в том, что их более 150! некоторые из которых содержат 100 и более переменных. Писать в коде программы все эти структуры - ничего хорошего.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2014, 00:32
Помогаю со студенческими работами здесь

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

Запись из бинарного файла, в массив структур
Имеется бинарный файл, в него записан массив структур.Как мне произвести запись из файла в массив?

Чтение вектора структур из бинарного файла
Есть функция записи и чтения: void fout(vector&lt;struc&gt;&amp;arr, string path) { int a, b; ofstream fl(path, ios::binary); ...

Чтение массива структур из бинарного файла
при выводе дает какую-то кашу из символов переписываю структуру из одного файла в 10. это необходимо для внешней сортировки слиянием ...

Как записать данные из файла в массив структур?
В коде я ввожу данные и их записывает в файл, помогите пожалуйста записать данные из файла в массив структур #include &lt;conio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru