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

Создание сложной структуры или класса - C++

Восстановить пароль Регистрация
 
Ukr
0 / 0 / 0
Регистрация: 17.06.2011
Сообщений: 7
18.06.2011, 00:13     Создание сложной структуры или класса #1
Народ я не специалист - поэтому писать желательно с коментарием

Необходимо открыть файл и прочитать в некую структуру
сам файл имеет очень сложный набор данных:

LineDB (
Serial ( 73 )
LineNodes ( 31 // количество записей
LineNode ( 1 // номер записи
LnEndNode ( 0 )
UiD ( -6155 14868 12 1 -6155 14868 151.587 1 -23.8518 0 -3.10518 0 )
LnPins ( 1 0 LnPin ( 2 1 ))
)
.
.
.

LineNode ( 8 // номер записи
LnJunctionNode ( 0 72 0 )
UiD ( -6155 14872 22 0 -6155 14872 473.209 1 49.05 0 -3.10419 0 )
lnPins ( 1 2 lnPin ( 10 0 ) lnPin ( 23 1 ) lnPin ( 30 1 ))
)
.
.
.
.
LineNode ( 23 // номер записи
lnVectorNode (
lnVectorSections ( 4 // количество строк переменной nVectorSections
183 72 -6155 14872 22 0 1 00 -6155 14872 473.209 1 49.05 0 -6.24578 0
175 72 -6155 14872 22 0 1 00 -6155 14872 473.266 1 50.5596 0 -6.24578 0
176 72 -6155 14872 15 1 0 00 -6155 14872 471.84 1 79.1219 0 -0.137131 0
183 72 -6155 14872 15 1 0 00 -6155 14872 470.415 1 107.685 0 -6.24578 0 )
) lnPins ( 1 1 lnPin ( 8 0 ) lnPin ( 24 0 ) )
)
)
//---------------------------------------------------------------------------
lineItemTable ( 24 // количество записей
PlatformItem (
LnItemId ( 0 )
LnItemSData ( 291.102 00000002 )
PlatformLnItemData ( 00000000 1 )
PlatformName ( " Start 1" )
Satel ( " Name" )
PlatformMinWaitingTime ( 180 )
PlatformNumWaiting ( 20 )
)
PlatformItem (
LnItemId ( 1 )
LnItemSData ( 404.275 00000002 )
PlatformLnItemData ( ffff0000 0 )
PlatformName ( " Start 1" )
Satel ( " Name" )
PlatformMinWaitingTime ( 180 )
PlatformNumWaiting ( 20 )
)
.
.
.
.
.


)

Писать структуру побывал что то типа
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
class DBList {
 
private:
        struct LnineEndNode  {              //        Структура для " Dot "
            int LineNode [1];              //   ( 1     порядковый номер запись 
            int LineEndNode [1];                //   значения  ( 0 )
            int UiD[12];                    //           ( -6155 14868 12 1 -6155 14868 151.587 1 -23.8518 0 -3.10518 0 )
 
            };
 
        struct LineJunctionNode {           //       Структура для " Jamp "
            int LineNode[1];                 //  ( 8     порядковый номер запись
            int LnJunctionNode[3];           //  ( 0 72 0 )
            int UiD[12];                     // ( -6155 14872 22 0 -6155 14872 473.209 1 49.05 0 -3.10419 0 )
 
            };
 
        struct LineVectorNode {                        //       Структура для " Line "
            int LineNode[1];                 // ( 17     порядковый номер запись 
            int LnVectorNode[1];                     //  ( if =4     требуєт создания записи LnVectorSections[int a]
            int LnVectorSections[16];              /* ( 16;
                                    186 79 -6155 14868 304 1 0 00 -6155 14868 120.265 1 -314.261 0 -5.96467 0
                                    15 24 -6155 14868 302 0 1 00 -6155 14868 122.53 1 -307.392 0 -5.96467 0
                                    15 24 -6155 14868 299 0 1 00 -6155 14868 142.406 1 -222.979 0 -6.1392 0
                                    186 79 -6155 14868 300 0 1 00 -6155 14868 147.323 1 -136.398 0 -0.0305431 0 )   )
                                     */
            int LnPins[8];                    //  ( 1 1 LnPin ( 16 1 ) LnPin ( 18 1 ))
                };
 
 
 
        struct  LineDB {
                int Serial [1];             // = ( 73 )
                int LineNodes [1];          // = (  31      количество записей  TrackNode
                struct LineEndNode ;
                struct LineJunctionNode ;
                struct LineVectorNode ;
                int LnItemTable[1];         // = (  24        количество записей
                };
 
 
public:
 
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ukr
0 / 0 / 0
Регистрация: 17.06.2011
Сообщений: 7
19.06.2011, 01:15  [ТС]     Создание сложной структуры или класса #2
Неужели никто не поможет?!

 Комментарий модератора 
Ваше сообщение и так увидят.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
19.06.2011, 03:14     Создание сложной структуры или класса #3
Я таки не понял твои стрктуры то нет того параметра который есть в файле, вот тебе примеры парсинга для размышления начиркал перед сном.
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
  struct  LineDB {
             int Serial [1];                         // = ( 73 )
             int LineNodes [1];                      // = (  31      количество записей  TrackNode
             int LineNode[1];
             int LnEndNode[1];
             float  UiD[12];
  };
 
  // только числа целые и не целые
  bool  _digit(const char* _s) {
      int c = 0, t = strlen(_s);
      while( *_s ) {
        if(isdigit( *_s ) || *_s == ',' || *_s == '-' )
               ++c;
                *_s++;
      }
      return (c == t) ? true : false;
  }
 
 
  // подсчёт указанных скобок
 int  _pos(const char* str, int  cnt) { 
     int ch = 0, pt = 0;
     for( ; *str != '\0'; *str++, ++ch) {
         if( *str == ')' ) {
            pt++;
            if(pt  >= cnt)
                  return ch + 1;
         }
     }
     return  0;
 }
 
 // парсер параметров  в скобках без вложений
 void   parse(std::string  val, const char* param, char*  sget, bool _space = true) {
    int pos = val.find(param, 0);
    std::string::iterator iter = val.begin() + pos + strlen(param);
    while( iter != val.end() ) {
        if( isspace( *iter) && _space || *iter == '(') {
            *iter++;
             continue;
        } 
        if( *iter == ')' )
            break;
        if(_space)
                  *sget++ = *iter;
        else {
                  if( *iter == '.' )
                 *sget++ = ',';
                  else
                 *sget++ = *iter;
        }
        *iter++;
    }
 }
 
 
// постройка структуры из  текста
bool  line_db(std::string  str, LineDB&  line) {
 
    int  first = str.find( "LineDB", 0);
    if(first == std::string::npos)
                 return false;
    int last = _pos(str.c_str() + first, 8);
    if(! last)
           return false;
 
    std::string tmp = str.substr(first, last - first);
 
    char  var[255];
    parse(tmp.c_str(), "Serial", var);
    line.Serial[0]         = atoi(var);
 
           parse(tmp.c_str(), "LineNodes", var);
    line.LineNodes[0] = atoi(var);
 
    parse(tmp.c_str(), "LineNode", var);
           line.LineNode[0] = atoi(var);
 
    parse(tmp.c_str(), "LnEndNode", var);
    line.LnEndNode[0] = atoi(var);
 
    parse(tmp.c_str(), "UiD", var, false);
    int  ic = 0;
    char* tok;
    for(tok = strtok(var, " "); tok; tok = strtok(NULL, " "), ic++) {
           if(_digit(tok)) 
        line.UiD[ic] = atof(tok);
    }
 
    return true;
}
 
 
 
 // тестим
 void  main(void){
 
    FILE*  fp = fopen("X:\\test.txt", "r" );
    std::string  str  = "";
 
    char buff[512];
    while(! feof(fp) ) {
        fgets(buff, sizeof(buff), fp);
        str.append(buff);
    }
    fclose(fp);
 
    LineDB  line;
    if(line_db(str, line))
           puts("\tYES PARSE - LineDB");
 
    printf("Serail = %d\nNodes = %d\nNode = %d\nEndNode = %d\n\nUiD: ", line.Serial[0], 
             line.LineNodes[0], line.LineNode[0], line.LnEndNode[0]);
 
    for(int i = 0; i < sizeof(line.UiD) / sizeof(float); i++)
            printf("%f, ", line.UiD[i] );
 
}
Ukr
0 / 0 / 0
Регистрация: 17.06.2011
Сообщений: 7
19.06.2011, 12:00  [ТС]     Создание сложной структуры или класса #4
Спасибо - Я проанализирую тот код который вы мне написали...
Сам файл выглядит так (правда я его немного форматировал табуляцией и переносом строки ) анализировать действительно нужно по скобкам и переменным. Значения целые и дробные с 6 знаками /не более/, отрицательное.

В нутри LineNodes ( есть три независимые структуры LnEndNode, LnJunctionNode, lnVectorNode
а в lineItemTable - PlatformItem своя сруктура...

Для корректного отображения - выделен как "С" !

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
LineDB (                        
    Serial ( 73 )                   // количество записей
        LineNodes ( 31              
            LineNode ( 1            // номер записи
                LnEndNode ( 0 ) 
                            UiD ( -6155 14868 12 1 -6155 14868 151.587 1 -23.8518 0 -3.10518 0 ) 
                                LnPins ( 1 0 LnPin ( 2 1 ))
                          )     
                …           // пропушено
            LineNode ( 8            // номер записи
                                 LnJunctionNode ( 0 72 0 )  UiD ( -6155 14872 22 0 -6155 14872 473.209 1 49.05 0 -3.10419 0 ) 
                                 lnPins ( 1 2 lnPin ( 10 0 ) lnPin ( 23 1 ) lnPin ( 30 1 )) 
                          ) 
            …           // пропушено
            LineNode ( 23           // номер записи
                lnVectorNode (      
                            lnVectorSections ( 4                // количество ячеек переменной nVectorSections
                                                            183 72 -6155 14872 22 0 1 00 -6155 14872 473.209 1 49.05 0 -6.24578 0 
                                                            175 72 -6155 14872 22 0 1 00 -6155 14872 473.266 1 50.5596 0 -6.24578 0 
                                                            176 72 -6155 14872 15 1 0 00 -6155 14872 471.84 1 79.1219 0 -0.137131 0 
                                                            183 72 -6155 14872 15 1 0 00 -6155 14872 470.415 1 107.685 0 -6.24578 0 
                                                        )
                     lnPins ( 1 1 lnPin ( 8 0 ) lnPin ( 24 0 )  
                )       
                 )              
        lineItemTable ( 24              // количество записей
            PlatformItem (          
                                    LnItemId ( 0 )
                                        LnItemSData ( 291.102 00000002 )
                                        PlatformLnItemData ( 00000000 1 )
                                        PlatformName ( " Start 1" )
                                        Satel ( " Name" )
                                        PlatformMinWaitingTime ( 180 )
                                        PlatformNumWaiting ( 20 )
                              )     
            …           // пропушено 
            PlatformItem (          
                                          LnItemId ( 1 )
                                          LnItemSData ( 404.275 00000002 )
                                          PlatformLnItemData ( ffff0000 0 )
                                          PlatformName ( " Start 1" )
                                          Satel ( " Name" )
                                          PlatformMinWaitingTime ( 180 )
                                          PlatformNumWaiting ( 20 )     
                                )
        )
  )
Ukr
0 / 0 / 0
Регистрация: 17.06.2011
Сообщений: 7
29.06.2011, 12:44  [ТС]     Создание сложной структуры или класса #5
Господа, знатоки С++!
не закрытый вопрос по этой теме! ПОМОГИТЕ

Как можно создать структуру в которой есть переменные - внутри которых тоже структура из элементов разного типа
а значения LineNode содержат номер записи из количества LineNodes

Отдельно в структуре есть структура PlatformItem в переменной LnItemId хранится нумерация (0 - n)



Спасибо всем кто откликнется.
Ukr
0 / 0 / 0
Регистрация: 17.06.2011
Сообщений: 7
04.07.2011, 21:24  [ТС]     Создание сложной структуры или класса #6
Ув. хАтом!

C++
1
 line.UiD[ic] = atof(tok);
Вот эта фраза - скорей не должна работать поскольку при отладке переменная tok содержит значение с запятой а нужна точка !!!
при выводе на екран -
C++
1
printf("%f, ", line.UiD[i] );
выдает нули - после запятой в значении где их нет.

я много чего не понимаю, прошу помочь...
Ukr
0 / 0 / 0
Регистрация: 17.06.2011
Сообщений: 7
11.07.2011, 02:27  [ТС]     Создание сложной структуры или класса #7
Ув silent_1991!

Вы говорите "...и так увидят" но почему то никто не смотрит
А вот когда я выделял - сразу обратили внимание!

Вопрос: как мне найти людей знающих С++ для консультаций по данной теме?

Я правда. уже в кое чем продвинулся. благодаря тому коду, что написал xAtom
но есть еще много не понятного...

C++
1
строка 67      int last = _pos(str.c_str() + first, 8);
зачем значение 8?

он доходит до 8 закрывающийся скобок и дальше не ищет...
до внимания - размер файла может быть и 100 кб и 7-10 МБ.
и в нем может быть более 5000 записей LineNode и каждую нужно перевести в некую структуру в памяти - чтобы можно было динамический доступаться к каждой цифровой переменной.

спасибо.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
11.07.2011, 05:58     Создание сложной структуры или класса #8
Цитата Сообщение от Ukr Посмотреть сообщение
Вопрос: как мне найти людей знающих С++ для консультаций по данной теме?
Ответ: во фрилансе
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2011, 07:54     Создание сложной структуры или класса
Еще ссылки по теме:

C++ разработать программу создания сложной структуры на примере
C++ Создание экземпляра класса до определения класса
Поля структуры внутри класса C++

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

Или воспользуйтесь поиском по форуму:
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
11.07.2011, 07:54     Создание сложной структуры или класса #9
Структура может содержать в качестве своего элемента другую структуру/массив структур/указатель на массив структур/указатель на массив указателей на структуры/ ну и т. д.

Если вкратце, то для решения данной задачи Вам потребуется для начала разобраться с динамическим выделением памяти.
Yandex
Объявления
11.07.2011, 07:54     Создание сложной структуры или класса
Ответ Создать тему
Опции темы

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