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

TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
NewEXE
3 / 3 / 1
Регистрация: 03.05.2014
Сообщений: 24
17.05.2014, 10:10     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #1
Вообщем-то, задача проста (для тех, кто работал с библиотекой TinyXML). Но я первый раз с ней работаю, и вообще первый раз со сторонними библиотеками.
Имеется: объект, содержащий данные XML-тега (получено с помощью метода FirstChildElement, сохранено в объект типа TiXmlElement).
Нужно: преобразовать или в string (лучше всего), или в массив char или в TiXmlString (последний вариант, тогда нужно TiXmlString в string перевести).

Заранее спасибо за помощь.

Добавлено через 9 минут

Выложил ниже main() - точку входа. Коротенько опишу класс Sum. Имеет поля "сумма", "буквенный код", "курс доллара". Без полиморфизма и наследования.
Кликните здесь для просмотра всего текста
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
int main()
{
    setlocale(0, "");
 
    float any2rur, to_usd_into_rur;
    Sum s1(500, 8.5, "UAH");
 
    TiXmlDocument *xml_MAIN = new TiXmlDocument("XML_daily.asp.xml");
    if(!xml_MAIN->LoadFile())
        return 1;
    TiXmlElement *xml_ValCurs = 0;
    TiXmlElement *xml_Valute = 0;
    TiXmlElement *xml_CharCode = 0;
    TiXmlElement *xml_Name = 0;
    TiXmlElement *xml_Value = 0;
 
    xml_ValCurs = xml_MAIN->FirstChildElement("ValCurs");
    xml_Valute = xml_ValCurs->FirstChildElement("Valute");
    xml_CharCode = xml_Valute->FirstChildElement("CharCode");
    //delete xml_CharCode;
    xml_Name = xml_Valute->FirstChildElement("Name");
    //delete xml_Name;
    xml_Value = xml_Valute->FirstChildElement("Value");
 
    string str1 = (string)xml_CharCode; //вот это организовать
    string str2 = s1.GetCode();
 
    while(xml_Valute != NULL)
    {
         if(str1 != str2) //для этого условия сравнения string
        {
            xml_Valute = xml_Valute->NextSiblingElement("Valute");
        }
        xml_Value->QueryFloatAttribute("Value", &any2rur);
    }
    //cout << &any2rur;
}


Добавлено через 10 часов 35 минут
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
17.05.2014, 12:59     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #2
NewEXE, http://sourceforge.net/projects/rapi...atest/download попробуй это.

Добавлено через 1 минуту
А также прочти это http://stackoverflow.com/questions/1...l-parser-for-c
NewEXE
3 / 3 / 1
Регистрация: 03.05.2014
Сообщений: 24
17.05.2014, 14:16  [ТС]     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #3
outoftime, Вы предлагаете мне полностью разобраться с другим парсером, вместо того, чтобы разобраться с одной-двумя функциями TinyXML?
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
17.05.2014, 21:35     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #4
NewEXE, выложи весь исходный код с makefile-ом.

Добавлено через 21 минуту
Цитата Сообщение от NewEXE Посмотреть сообщение
string str1 = (string)xml_CharCode; //вот это организовать
Что ты хочешь получить на выходе? Тебе нужен только внутренний текст?

Добавлено через 4 минуты
В общем подход один и тот же.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <tinyxml.h>
#include <string>
#include <iostream>
 
using namespace std;
 
int main()
{
    TiXmlDocument *xml_MAIN = new TiXmlDocument("XML_daily.asp.xml");
    TiXmlElement *xml_ValCurs = 0;
    TiXmlElement *xml_Valute = 0;
    TiXmlElement *xml_CharCode = 0;
 
    xml_ValCurs = xml_MAIN->FirstChildElement("ValCurs");
    xml_Valute = xml_ValCurs->FirstChildElement("Valute");
    xml_CharCode = xml_Valute->FirstChildElement("CharCode");
    
    const char* text = xml_CharCode->GetText();
    string str1(text, text + strlen(text));
}
Добавлено через 54 секунды
NewEXE, идет?
NewEXE
3 / 3 / 1
Регистрация: 03.05.2014
Сообщений: 24
18.05.2014, 01:34  [ТС]     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #5
outoftime, да, мне всего лишь нужен был "внутренний текст", я его получил. Но это, как ни странно, не помогло мне решить мою задачу
cout << &any2rur выводит неверное значение, вернее, какой-то (?)адрес. Он должен вывести значение "гривна к рублю" (т.к. Sum s1(500, 8.5, "UAH") ). Выкладываю весь код
Кликните здесь для просмотра всего текста
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// <NewEXE> <Задача 11, денежная сумма> <14.03.2014>
 
#include <iostream>
#include <clocale>
#include <string>
#include <tinyxml.h>
using namespace std;
 
class Sum
{
private:
    float sum;
    string code;
    float kurs;
 
public:
 Sum() // Конструктор по-умолчанию
    {
        SetSum(1);
        SetCode("USD");
        SetKurs(1);
    }
 
 Sum(float IntSum, float IntKurs, string IntCode) // Инициализирующий конструктор
    {
        if(IntSum > 0 && IntKurs > 0)
            {
                SetSum(IntSum);
                SetCode(IntCode);
                SetKurs(IntKurs);
            }
        else
            {
                SetSum(1);
                SetCode("USD");
                SetKurs(1);
            }
 }
 
 Sum(Sum& c) // Копирующий конструктор
    {
        SetSum(c.sum);
        SetCode(c.code);
        SetKurs(c.kurs);
    }
 
 Sum(float IntSum, float IntKurs) // К-р преобразования
    {
        SetSum(IntSum);
        SetKurs(IntKurs);
        SetCode("USD");
    }
 
 void Init(float IntSum, float IntKurs, string IntCode) // Функция инициализации
    {
        if(IntSum > 0 && IntKurs > 0)
            {
                SetSum(IntSum);
                SetCode(IntCode);
                SetKurs(IntKurs);
            }
        else
            {
                SetSum(1);
                SetCode("UAH");
                SetKurs(1);
            }
    }
 
 void Print() const // Функция вывода на экран объекта "сумма"
    {
        cout << "Код валюты: \n" << code <<endl << "Кол-во: " << sum <<endl << "Курс доллара: " << kurs <<endl<<endl;
    }
 
 void Print4float(float N) const // Функция вывода на экран числа float
    {
        cout << N <<endl;
    }
 
 void Sravn(Sum s2) const // Сравнение двух сумм
    {
        if(sum > s2.sum)
            cout << "Первая сумма > Второй суммы";
        if(sum < s2.sum)
            cout << "Первая сумма < Второй суммы";
        if(sum == s2.sum)
            cout << "Суммы равны";
    }
 
 float Add(Sum s2) // Сложение двух сумм
    {
        float Rezult;
        Rezult = sum + s2.sum;
        return Rezult;
    }
 
 float Convert() // Вычисление значения суммы в долларах
    {
        float Rezult;
        Rezult = sum / kurs;
        return Rezult;
    }
 
 float GetSum()
    {
        return sum;
    }
 
 string GetCode()
    {
        return code;
    }
 
 float GetKurs()
    {
        return kurs;
    }
 
 void SetSum(float f)
    {
        if(f < 0)
            sum = 1;
        else sum = f;
    }
 
 void SetCode(string s)
    {
        if(s == "")
            code = "USD";
        else code = s;
    }
 
  void SetKurs(float f)
    {
        if(f <= 0)
            kurs = 1;
        else kurs = f;
    }
};
 
int main()
{
    setlocale(0, "");
 
    float any2rur, to_usd_into_rur;
    Sum s1(500, 8.5, "UAH");
 
    TiXmlDocument *xml_MAIN = new TiXmlDocument("XML_daily.asp.xml");
    if(!xml_MAIN->LoadFile())
        return 1;
    TiXmlElement *xml_ValCurs = 0;
    TiXmlElement *xml_Valute = 0;
    TiXmlElement *xml_CharCode = 0;
    TiXmlElement *xml_Name = 0;
    TiXmlElement *xml_Value = 0;
 
    xml_ValCurs = xml_MAIN->FirstChildElement("ValCurs");
    xml_Valute = xml_ValCurs->FirstChildElement("Valute");
    xml_CharCode = xml_Valute->FirstChildElement("CharCode");
    //delete xml_CharCode;
    xml_Name = xml_Valute->FirstChildElement("Name");
    //delete xml_Name;
    xml_Value = xml_Valute->FirstChildElement("Value");
 
    string str1 = xml_CharCode->GetText();
    string str2 = s1.GetCode();
 
    while(xml_Valute != NULL)
    {
         if(str1 != str2) //для этого условия сравнения string
        {
            xml_Valute = xml_Valute->NextSiblingElement("Valute");
        }
        else xml_Value->QueryFloatAttribute("Value", &any2rur);
    }
    cout << &any2rur;
}
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
18.05.2014, 01:59     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #6
NewEXE, http://www.cplusplus.com/reference/cstring/
NewEXE
3 / 3 / 1
Регистрация: 03.05.2014
Сообщений: 24
18.05.2014, 02:31  [ТС]     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #7
outoftime, вы хотите сказать, что я неправильно присваиваю значения string-ам?
C++
1
2
string str1 = xml_CharCode->GetText();
    string str2 = s1.GetCode();

Не по теме:

как благодарить на форуме?

outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
18.05.2014, 03:05     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #8

Не по теме:

Цитата Сообщение от NewEXE Посмотреть сообщение
как благодарить на форуме?
Кнопка "+1 Спасибо" под сообщением



Цитата Сообщение от NewEXE Посмотреть сообщение
вы хотите сказать, что я неправильно присваиваю значения string-ам?
Я хочу сказать что вы вообще не знаете что это такое, поэтому и дал ссылку на описание всех функций для работы с сишными строками (это не строки плюсов, это - си)

Добавлено через 1 минуту
Грубо говоря это просто
C++
1
typedef char* string;
Добавлено через 1 минуту
Ну и договоренность что каждая строка кончается нуль-символом, т.е. значение ячейки массива символов должна быть равна нулю. Почитайте что-то о сишных строках словом..
NewEXE
3 / 3 / 1
Регистрация: 03.05.2014
Сообщений: 24
18.05.2014, 10:10  [ТС]     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #9
outoftime, у Вас сложилось ложное впечатление о моих знаниях о std::string. Из char в string легко неявно переводится оператором = (он перегружен для этого). А вот насчет условия - можно было просто сказать, чтобы я попробовал strcmp. Сейчас попробую, отпишусь

C++
1
if(strcmp(str1.c_str(), str2.c_str()) != 0)
не работает, опять то же выводит
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.05.2014, 10:23     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #10
Покажите последний вариант кода и минимальный кусок xml для воспроизведения проблемы.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
18.05.2014, 12:05     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #11
Цитата Сообщение от NewEXE Посмотреть сообщение
оператором = (он перегружен для этого)
Не знал. Но тогда лучше использовать copy construct-ор.

Цитата Сообщение от 0x10 Посмотреть сообщение
Покажите последний вариант кода и минимальный кусок xml для воспроизведения проблемы.
Поддерживаю, в библиотечных функциях вряд ли проблема.
NewEXE
3 / 3 / 1
Регистрация: 03.05.2014
Сообщений: 24
18.05.2014, 19:25  [ТС]     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #12
Максимально закомментировал main(), чтобы ясны были намерения.

Кликните здесь для просмотра всего текста
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// <NewEXE> <Задача 11, денежная сумма> <14.03.2014>
 
#include <iostream>
#include <clocale> //Для русского в консоли
#include <string>
#include <tinyxml.h>
using namespace std;
 
class Sum
{
private:
    float sum;
    string code;
    float kurs;
 
public:
 Sum() // Конструктор по-умолчанию
    {
        SetSum(1);
        SetCode("USD");
        SetKurs(1);
    }
 
 Sum(float IntSum, float IntKurs, string IntCode) // Инициализирующий конструктор
    {
        if(IntSum > 0 && IntKurs > 0)
            {
                SetSum(IntSum);
                SetCode(IntCode);
                SetKurs(IntKurs);
            }
        else
            {
                SetSum(1);
                SetCode("USD");
                SetKurs(1);
            }
 }
 
 Sum(Sum& c) // Копирующий конструктор
    {
        SetSum(c.sum);
        SetCode(c.code);
        SetKurs(c.kurs);
    }
 
 Sum(float IntSum, float IntKurs) // К-р преобразования
    {
        SetSum(IntSum);
        SetKurs(IntKurs);
        SetCode("USD");
    }
 
 void Init(float IntSum, float IntKurs, string IntCode) // Функция инициализации
    {
        if(IntSum > 0 && IntKurs > 0)
            {
                SetSum(IntSum);
                SetCode(IntCode);
                SetKurs(IntKurs);
            }
        else
            {
                SetSum(1);
                SetCode("UAH");
                SetKurs(1);
            }
    }
 
 void Print() const // Функция вывода на экран объекта "сумма"
    {
        cout << "Код валюты: \n" << code <<endl << "Кол-во: " << sum <<endl << "Курс доллара: " << kurs <<endl<<endl;
    }
 
 void Print4float(float N) const // Функция вывода на экран числа float
    {
        cout << N <<endl;
    }
 
 void Sravn(Sum s2) const // Сравнение двух сумм
    {
        if(sum > s2.sum)
            cout << "Первая сумма > Второй суммы";
        if(sum < s2.sum)
            cout << "Первая сумма < Второй суммы";
        if(sum == s2.sum)
            cout << "Суммы равны";
    }
 
 float Add(Sum s2) // Сложение двух сумм
    {
        float Rezult;
        Rezult = sum + s2.sum;
        return Rezult;
    }
 
 float Convert() // Вычисление значения суммы в долларах
    {
        float Rezult;
        Rezult = sum / kurs;
        return Rezult;
    }
 
 float GetSum()
    {
        return sum;
    }
 
 string GetCode()
    {
        return code;
    }
 
 float GetKurs()
    {
        return kurs;
    }
 
 void SetSum(float f)
    {
        if(f < 0)
            sum = 1;
        else sum = f;
    }
 
 void SetCode(string s)
    {
        if(s == "")
            code = "USD";
        else code = s;
    }
 
  void SetKurs(float f)
    {
        if(f <= 0)
            kurs = 1;
        else kurs = f;
    }
};
 
int main()
{
    setlocale(0, "");
 
    float any2rur, to_usd_into_rur;
    Sum s1(500, 8.5, "UAH"); //кол-во денег, курс к доллару, гривны
 
    TiXmlDocument *xml_MAIN = new TiXmlDocument("XML_daily.asp.xml"); 
    if(!xml_MAIN->LoadFile()) //если произошла ошибка загрузки файла
        return 1;
    TiXmlElement *xml_ValCurs = 0;
    TiXmlElement *xml_Valute = 0;
    TiXmlElement *xml_CharCode = 0;
    TiXmlElement *xml_Name = 0;
    TiXmlElement *xml_Value = 0;
 
/* Такими нехитрыми действиями добираюсь к нужному мне тегу Value нужного CharCode
(в нашем случае, UAH) */
    xml_ValCurs = xml_MAIN->FirstChildElement("ValCurs");
    xml_Valute = xml_ValCurs->FirstChildElement("Valute");
    xml_CharCode = xml_Valute->FirstChildElement("CharCode");
    xml_Name = xml_Valute->FirstChildElement("Name");
    //delete xml_Name; //пока не выяснил, в чем проблема, не буду удалять, во избежание новых
    xml_Value = xml_Valute->FirstChildElement("Value");
 
/* для сравнения CharCode XML-файла и моего s1.code (UAH) */
    string str1 = xml_CharCode->GetText(); //получил CharCode
    string str2 = s1.GetCode(); //получил s1.code
 
    while(xml_Valute != NULL) // проходим по всем полям "Valute" (по примеру из документации)
    {
         if(str1 != str2) //если в CharCode не гривны, то...
        {
            xml_Valute = xml_Valute->NextSiblingElement("Valute"); // идем дальше по полям "Valute"
        }
        else xml_Value->QueryFloatAttribute("Value", &any2rur); //иначе же сохраняем значение "Value" в any2rur
    }
    cout << &any2rur; // тут 0x28fedc. Должно быть 29,2879
    return 0;
}
XML
1
2
3
4
5
6
7
8
9
<ValCurs Date="17.05.2014" name="Foreign Currency Market">
    <Valute ID="R01720">
    <NumCode>980</NumCode>
    <CharCode>UAH</CharCode>
    <Nominal>10</Nominal>
    <Name>Украинских гривен</Name>
    <Value>29,2879</Value>
    </Valute>
<-- Другие Valute -->
http://www.cbr.ru/scripts/xml_daily.asp , сохранен локально


Добавлено через 6 минут

Добавлено через 10 минут

Не по теме:

Потом еще учту информацию поля Nominal, организую функцию присвоения CharCode моему code, функцию перевода рублей в доллары, добавлю деструкторы, класс-контейнер, найду способ вытащить из asp xml (чтоб работало по http), оснащу графическим интерфейсом WinForms, можут быть, что-то придумаю насчет полиморфизма и наследования, запилю инсталлятор. И будет простенький онлайн-оффлайн конвертер валют :-) Но с этим мне помощь не нужна (по крайней мере, пока что)

0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.05.2014, 20:49     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #13
NewEXE, в строке 178 выводится адрес переменной. Это явно не то, чего вы ожидаете.
Второй косяк - в строках 167-168 сохраняются значения искомого кода валюты и кода из первого узла. Больше значения нигде не меняются, только xml_Valute бежит по узлам. Естественно, они никогда не станут равны, и присваивание в строке 176 никогда не будет выполнено.
NewEXE
3 / 3 / 1
Регистрация: 03.05.2014
Сообщений: 24
18.05.2014, 21:49  [ТС]     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #14
0x10,
Сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while(xml_CharCode != NULL)
    {
        if(xml_CharCode->GetText() != str2)
        {
            xml_CharCode = xml_CharCode->NextSiblingElement("CharCode");
        }
        else str1 = xml_CharCode->GetText();
    }
 
while(xml_Valute != NULL)
    {
         if(str1 != str2) //для этого условия сравнения string
        {
            xml_Valute = xml_Valute->NextSiblingElement("Valute");
        }
        else xml_Value->QueryFloatAttribute("Value", &any2rur);
    }
    cout << any2rur;
не работает
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.05.2014, 21:58     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #15
У узла CharCode нет таких же узлов его уровня (siblings).
Используйте отладочную печать на каджом шаге - бысрее разберетесь.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
19.05.2014, 01:14     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
NewEXE, настоятельно рекомендую соблюдать форматирование как у меня. Я много чего переделал, много чего оставил как есть, ибо очень много чего сделано "не как у людей", к примеру:

- название методов в камелкейсе начинаются с буквы нижнего регистра, т.е не GetSum а getSum
- если параметр не будет изменятся внутри функции\метода помечайте его как константный указатель на объект, тогда у вас не будет проблем если пользователь передаст константное значение, ибо преобразование T > const T - валидно, а const T > T возможно только через const_cast<T> и без него вызовет ошибку компиляции

И много много чего еще..

Как сделать нормальное преобразование char* в double для любой локали сделаешь сам, либо на форуме найдешь (кажется даже маны писали).

Собственно сам код:

Кликните здесь для просмотра всего текста
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
120
121
122
#include <iostream>
#include <string>
#include <tinyxml.h>
 
using namespace std;
 
class Sum
{
private:
    float sum;
    string code;
    float kurs;
 
public:
    // Собрал 4 конструктора в 1
    Sum(float IntSum = 1, float IntKurs = 1, string IntCode = "USD") {
        if (!(IntSum > 0 && IntKurs > 0)) {
            IntSum = 1;
            IntKurs = 1;
        }
        SetSum(IntSum);
        SetCode(IntCode);
        SetKurs(IntKurs);
    }
 
    // Так как передаваемый класс уже верифицировал валидность параметров
    // достаточно вызвать copy constructor-ы для полей класса
    Sum(const Sum& c) : sum(c.sum), code(c.code), kurs(c.kurs) { }
 
    void Init(float IntSum, float IntKurs, string IntCode) {
        if (IntSum > 0 && IntKurs > 0) {
            SetSum(IntSum);
            SetCode(IntCode);
            SetKurs(IntKurs);
        } else {
            SetSum(1);
            SetCode("UAH");
            SetKurs(1);
        }
    }
 
    void Print() const {
        cout << "Код валюты: \n" << code << endl << "Кол-во: " << sum << endl 
            << "Курс доллара: " << kurs << endl << endl;
    }
 
    void Print4float(const float &N) const {
        cout << N << endl;
    }
 
    void Sravn(const Sum &s2) const {
        if (sum > s2.sum)
            cout << "Первая сумма > Второй суммы";
        else if (sum < s2.sum)
            cout << "Первая сумма < Второй суммы";
        else 
            cout << "Суммы равны";
    }
 
    float Add(const Sum &s2) const {
        float Rezult;
        Rezult = sum + s2.sum;
        return Rezult;
    }
 
    float Convert() const {
        float Rezult;
        Rezult = sum / kurs;
        return Rezult;
    }
 
    float GetSum() const { return sum; }
 
    string GetCode() const { return code; }
 
    float GetKurs() const { return kurs; }
 
    void SetSum(float f) {
        sum = f < 0 ? 1 : f;
    }
 
    void SetCode(string s) {
        code = s.empty() ? "USD" : s;
    }
 
    void SetKurs(float f) {
        kurs = f <= 0 ? 1 : f;
    }
};
 
int main () {
    TiXmlDocument *xml_MAIN = new TiXmlDocument("XML_daily.asp.xml");
    // Если так делаешь выдеяй его пожирнее, что-бы в глаза кидалось
    // а то пропустишь это место и будешь думать почему код далее не исполняется
    if (!xml_MAIN->LoadFile()) 
    {
        return 1;
    }
 
    TiXmlElement *xml_ValCurs, *xml_Valute, *xml_CharCode, *xml_Value;
 
    xml_ValCurs = xml_MAIN->FirstChildElement("ValCurs");
    xml_Valute = xml_ValCurs->FirstChildElement("Valute");
    
    Sum s1(500, 8.5, "UAH");
    double value; // сюда схраним значение тега
 
    // проходим по всем полям "Valute"
    for (; xml_Valute != 0; xml_Valute = xml_Valute->NextSiblingElement("Valute")) {
        xml_CharCode = xml_Valute->FirstChildElement("CharCode");
        
        if (!strcmp(s1.GetCode().c_str(), xml_CharCode->GetText())) {
            xml_Value = xml_Valute->FirstChildElement("Value");
            // Старая сишная конвертация учитывает локаль неудобным образом
            // советую использовать stringstream для этих целей, либо другой
            // способ преобразования char* в double
            value = atof(xml_Value->GetText());
            break;
        }
    }
    cout << value << endl;
}

Bash
1
2
3
ruslan@TFTM-K53TA:~/Programming/c++/cyberforum$ make tinyxml && ./main 
clang++ main.cpp -o main -std=c++11 -ltinyxml -W
29
Добавлено через 7 минут
NewEXE, P.S. мне удалось уменьшить размер кода на 60 строк, что почти треть, не уменьшая при этом читабельности. Поработайте и выработайте свой стиль форматирование либо используйте чей-то, к примеру: c++ google coding style (хотя я использую немного другой)
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
19.05.2014, 05:01     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #17
Цитата Сообщение от outoftime Посмотреть сообщение
"не как у людей"
Цитата Сообщение от outoftime Посмотреть сообщение
- название методов в камелкейсе начинаются с буквы нижнего регистра, т.е не GetSum а getSum
Вот уж что непринципиально.

Хоть я сам и двинут на стиле, но в данном случае дело даже не в нем. Если говорить о качестве кода, то тут в большей части случаев я бы не давил ошибки невалидных параметров, подставляя какие-то значения по умолчанию, а кидал бы исключения.
NewEXE
3 / 3 / 1
Регистрация: 03.05.2014
Сообщений: 24
19.05.2014, 12:47  [ТС]     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #18
outoftime, большое спасибо за аудит кода и поправки! Я изучаю программирование первый год, важно выработать правильный стиль.
Сделал, как Вы советовали, через stringstream (сейчас кода при мне нет). Все работает (ура!), если бы не одно "но" - в xml в числах вместо точек стоит запятая...
Что можно тут придумать?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
19.05.2014, 13:04     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #19
Цитата Сообщение от NewEXE Посмотреть сообщение
Что можно тут придумать?
Вариантов несколько.
1. Тупо в строке заменяем запятую на точку. Неправильно, зато быстро.
2. Устанавливаем локаль для потока. Пример кода, думаю, достаточно ясен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <locale>
#include <sstream>
 
int main() {
    std::locale l("ru_RU");
 
    std::stringstream ss("3,14");
    ss.imbue(l);
 
    double pi;
    ss >> pi;
 
    std::cout << pi << std::endl;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2014, 14:19     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string
Еще ссылки по теме:

C++ string[] в char[][] или char[]
Преобразовать string в массив char C++
C++ Как преобразовать string в char*?

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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
19.05.2014, 14:19     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string #20
Цитата Сообщение от NewEXE Посмотреть сообщение
Что можно тут придумать?
Все уже придумано до нас. На форуме эта тема поднималась не раз. (подпевай :)
Yandex
Объявления
19.05.2014, 14:19     TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string
Ответ Создать тему
Опции темы

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