Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 49
1

Как организовать чтение файла содержащего разнотипные структуры?

09.08.2017, 18:09. Показов 805. Ответов 25
Метки нет (Все метки)

Задача следующая есть файл внутренняя структура которого зависит от его же внутренних полей.
Вот простенький пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct
{
//много разных полей 
}type1;
 
typedef struct
{
//много других разных полей 
}type2;
 
/*структура файла
такова что сначала читается значение необходимого поля (пусть это будет поле flag)
и в зависимости от его значения читается вектор либо type1, либо type2*/
 
typedef struct
{
bool flag;
std::vector<type1 или type2> data;
}type1
Собственно вопрос как организовать чтение такого файла?

Совет по типу прочитай сначала флаг, а потом уже заполняй тот или иной вектор не пойдет. Ибо это всего лишь пример, на деле полей, которые задают дальнейшию типизацию данных может быть много в одном файле и разбросаны по файлу.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2017, 18:09
Ответы с готовыми решениями:

Как организовать чтение из файла
вот есть программа как сделать чтобы она считывалась с файла построчно типа записи Public Class...

Чтение из файла (как организовать проверку на ошибку чтения?)
Как на C организовать проверку на ошибку чтения файла ? ( т.е если файл невозможно прочитать,...

Чтение txt файла, содержащего массив структур
Добрый вечер! Прошу помощи у опытных людей. При решении задачи столкнулся с проблемой чтения...

как можно организовать чтение файла Word (*.doc, *.rtf) в PHP?
У меня вопрос: как можно организовать чтение файла Word (*.doc, *.rtf), с последующим отображением...

25
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 49
09.08.2017, 18:17  [ТС] 2
Ну например формат хранения геоданных SXF.
0
Don't worry, be happy
17268 / 10139 / 1963
Регистрация: 27.09.2012
Сообщений: 25,364
Записей в блоге: 1
09.08.2017, 18:25 3
std::variant? union? Иерархия классов?
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
09.08.2017, 18:32 4
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
Вот простенький пример:
Этот пример ничего не говрит о формате данных в файле. Без представления о формате данных в файле, нельзя ответить на вопрос:
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
как организовать чтение такого файла?
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 49
09.08.2017, 18:43  [ТС] 5
первые 4 байт - это int в котором содержится количество записей в файле
пятый байт файла содержит информацию о том набор каких данных будет идти далее
если 0 то за ним идет набор записей, каждая запись состоит из 2 целых числа типа int
если 1 то за ним идет набор записей, каждая запись состоит из 3 чисел с плавающей запятой типа double
ради примера)
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
09.08.2017, 19:46 6
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
первые 4 байт - это int в котором содержится количество записей в файле
Может, количество записей, которые идут после пятого байта?
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
09.08.2017, 19:48 7
Тогда в чём проблема? Читай, в бинарном режиме, нужное количество байтов (в переменную соответствующего типа), если нужно анализируй прочитанные данные, и т.д.
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 49
09.08.2017, 19:51  [ТС] 8
Это и имелось в виду. "Записями" в данном контексте называется то что идет после 5 байта

Добавлено через 2 минуты
Но как их хранить в одном std::vector<type1 или type2> data в зависимости от флага, а не заводить два разных
std::vector<type1> data1 и std::vector<type2> data2 внутри одной структуры?
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
09.08.2017, 19:51 9
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
"Записями" в данном контексте называется то что идет после 5 байта
Я понял, что называется записями. Уточнение было по поводу "в файле". В файле, как я понял, не один же такой блок записей?
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 49
09.08.2017, 19:52  [ТС] 10
верно поняли.
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
09.08.2017, 19:54 11
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
Но как их хранить в одном std::vector<type1 или type2> data в зависимости от флага, а не заводить два разных std::vector<type1> data1 и std::vector<type2> data2 внутри одной структуры?
Это совсем другая тема.
Цитата Сообщение от Croessmah Посмотреть сообщение
std::variant? union? Иерархия классов?
0
Don't worry, be happy
17268 / 10139 / 1963
Регистрация: 27.09.2012
Сообщений: 25,364
Записей в блоге: 1
09.08.2017, 19:56 12
Сыро:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Record
{
    //bool type;
    union {
        struct {
            int first;
            int second;
        } int_data;
        struct {
            double first;
            double second;
            double third;
        } real_data;
    } data;
};
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 49
09.08.2017, 20:08  [ТС] 13
И уточнение. Конкретном файле хранятся либо только блоки type1, либо блоки type2. Одновременно внутри одно файла оба типа существовать не могут.

Добавлено через 6 минут
Это все хорошо, но если int_data будет занимать например 8 байт, а real_data к примеру 256. То union то будет 256 не зависимо от того что мы храним(

Добавлено через 4 минуты
Или еще хуже не дай бог один из типов внутри например структуры int_data будет класс, так union заругается на конструктор
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
09.08.2017, 20:19 14
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
И уточнение. Конкретном файле хранятся либо только блоки type1, либо блоки type2. Одновременно внутри одно файла оба типа существовать не могут.
В чём тогда проблема? Как динамически создать нужный вектор?
0
Don't worry, be happy
17268 / 10139 / 1963
Регистрация: 27.09.2012
Сообщений: 25,364
Записей в блоге: 1
09.08.2017, 20:21 15
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
а real_data к примеру 256.
это ради примера
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
если 0 то за ним идет набор записей, каждая запись состоит из 2 целых числа типа int
если 1 то за ним идет набор записей, каждая запись состоит из 3 чисел с плавающей запятой типа double
ради примера)
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
Или еще хуже не дай бог один из типов внутри например структуры int_data будет класс
Каков вопрос, таков ответ. Из Вас же информации не вытащишь.
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 49
09.08.2017, 20:24  [ТС] 16
проблема все в том же, как не зависимо от типа блоков обращаться к ним через одно имя data

Добавлено через 1 минуту
Согласен, не полно описал вопрос. Извините.
0
1506 / 825 / 175
Регистрация: 05.12.2015
Сообщений: 2,457
09.08.2017, 20:47 17
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
проблема все в том же, как не зависимо от типа блоков обращаться к ним через одно имя data
Как именно вы хотите обращаться через одно имя data? Пример кода?
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 49
09.08.2017, 20:50  [ТС] 18
все обращение ограничены только методами std::vector.
думаю методов at и pushback будет достаточно
0
1506 / 825 / 175
Регистрация: 05.12.2015
Сообщений: 2,457
09.08.2017, 20:53 19
Цитата Сообщение от evgen_sobolev Посмотреть сообщение
думаю методов at и pushback будет достаточно
достаточно для чего? Вызвали вы at. что дальше? Как вы собираетесь обрабатывать эти данные?
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 49
09.08.2017, 20:54  [ТС] 20
уже непосредственно буду смотреть на флаг и понимать какие данные там лежат и как к ним обращаться
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2017, 20:54

Как мне организовать чтение из файла числовых данных (не текста) и записать в переменную
Как мне организовать чтение из файла числовых данных (не текста) и записать в переменную

Запись структуры и чтение из файла в структуру ( как бы лучше )
Подкиньте идею как лучше записать структуру в файл и обратно из файла в структуру У меня есть...

Чтение чисел из файла, содержащего концевые пробелы и переносы строк.
Здравствуйте! Помогите, пожалуйста, разобраться со следующей задачей. В текстовом файле...

Как организовать сериализацию экземпляров класса, содержащего список?
Есть класс LengthOnPicture, который хранит расстояние и текст: public class LengthOnPicture...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru