С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка "Попытка чтения в запрещенную память" при работе с файлами http://www.cyberforum.ru/cpp-beginners/thread1178382.html
Нужно хранить в файле данные со структуры и считывать их. Перепробовал кучу вариантов (fopen и ofstream/ifstream), постоянно одна и та же ошибка. "Необработанное исключение типа...
C++ Связные списки. Определить количество узлов между двумя выбранными указателями #include <iostream> #include <cstdlib> using namespace std; struct Node { int data; Node* next; http://www.cyberforum.ru/cpp-beginners/thread1178373.html
C++ Remove_if для std::list
Здравствуйте! Помогите мне разобраться,пожалуйста.Перечитал кучу всего,но так и не понял ,что можно писать в аргументе метода remove_if. #include<iostream> #include<list> #include<algorithm>...
C++ Как считать n-ое слово в строке
Как найти любое (n-ное) слово в строке? Слова(группа слов) разделяются запятыми
C++ Перенос из directx8 в directx9, ошибка в SetVertexShader http://www.cyberforum.ru/cpp-beginners/thread1178331.html
Доброе время суток. Есть кусок кода написанного для directx8 #include <d3dx8.h> #include <mmsystem.h> #include <C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\WinNT.h> #include...
C++ Переставить элементы в этом массиве Ввести массив чисел с задаваемым количеством элементов и некоторое число. Без использования другого массива переставить элементы в этом массиве так, чтобы в начале массива оказались элементы не... подробнее

Показать сообщение отдельно
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
19.05.2014, 01:14
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 (хотя я использую немного другой)
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.