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

Сохранение Xml файла - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти цифровой корень натурального числа (рекурсия) http://www.cyberforum.ru/cpp-beginners/thread1628239.html
Найти цифровой корень натурального числа (x). Алгоритм нахождения цифрового корня в следующем: -Сложить все цифры этого числа (->s) -Сложить все цифры найденной суммы (->s2). -Повторить процесс до...
C++ Написать программу обмена каждых двух соседних значений в векторе, используя цикл for(int i=0;i<tok.size();i+2) { swap(tok,tok); } Цикл предназначен для обмена каждых двух соседних значений в векторе. Вместо того чтобы выполняться нормально, зацикливается до... http://www.cyberforum.ru/cpp-beginners/thread1628230.html
C++ Функция формирующая целое значение по строке из нулей и единиц, кодирующей это целое значение в двоичной форме
Напишите функцию, формирующую целое значение по строке из нулей и единиц, кодирующей это целое значение в двоичнойформе, и вызывающую ее главную функцию.
Подсчитать числа вводимых символов используя цикл while C++
Напишите программу подсчета числа вводимых символов, используя цикл while.
C++ Решение системы линейных уравнений третьего порядка по правилу Крамера http://www.cyberforum.ru/cpp-beginners/thread1628226.html
Напишите функцию для решения системы линейных уравнений третьего порядка по правилу Крамера
C++ Вычислить выражение, исходя из заданной последовательности вещественных чисел Дана непустая последовательность положительных вещественных чисел x1, x2, … , xn (n заранее не известно), за которой следует отрицательное число. Вычислить величину nx1+ (n–1)x2 + … + 2xn-1 +xn. ... подробнее

Показать сообщение отдельно
Ника))
41 / 41 / 8
Регистрация: 08.12.2010
Сообщений: 339

Сохранение Xml файла - C++

29.12.2015, 07:40. Просмотров 265. Ответов 2
Метки (Все метки)

Вот есть небольшой класс для создания и редактирования XML файла:
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
class XML_TEMPLATENIK
{
private:
    struct CLIENTNIK
    {
        xml_document _doc;  // Класс документа XML. Хранит всю создаваемую структуру файла.
        xml_node _task;     // Узел списка задач
        int _task_count;    // Количество добавленный в документ задач. Нужно в основном для правильной нумерации добавляемых задач.
        int _id_client;     // Идентификатор клиента
        string _filename;   // Имя файла
    };
 
    vector<CLIENTNIK*> _client;// Массив документов клиентов  типа класс 
    // Проверка на существование уникальных идентификаторов , что бы предотвратить крах программы
    bool _proverkaID(_In_ int id);
 
public:
    int countVarik;
 
    XML_TEMPLATENIK();
    ~XML_TEMPLATENIK();
 
    //предварительное создание выделенного id для клиента в классе xml
    bool CreateClientId(_In_ int id);
 
    // Создаёт новый документ
    // id - идентификатор клиента
    // filename - указать имя файла (не обязательно)
    bool CreateDocument(_In_ int id, _In_ const char* filename);
 
    //Добавляет задание к существующему документу
    // nomerZadanie - номер решенного задания
    // otvetFirst - ответ на первое задание
    // zadanieFirst - текст первого задания
    // typeZadanie - тип первого задания
    bool AddZadanie(_In_ int id, _In_ const int nomerZadanie, _In_ const char* otvetZadanie, _In_ const char* textZadanie, _In_ const char * typeZadanie, _In_ const char * teamZadanie, _In_ const char * zametkaZadanie, _In_ const char * tochnZadanie, _In_ const char * peremZadanie, _In_ const char * slZadanie, _In_ const char * trZadanie);
 
 
};
 
 
XML_TEMPLATENIK::XML_TEMPLATENIK()
{
    countVarik = 0;
    _client.clear();
}
 
XML_TEMPLATENIK::~XML_TEMPLATENIK()
{
    // Сбросить все данные документа
    _client.clear();
}
 
 
bool XML_TEMPLATENIK::_proverkaID(_In_ int id)
{
    if (id < _client.size())
    {
        return true;
    }
//  _printLog("\nИспользуемый ID не существует , перезагрузите подключенный клиент, ID:= %i\n", id);
    return false;
};
 
bool XML_TEMPLATENIK::CreateClientId(_In_ int id)
{
    CLIENTNIK *newClient = new CLIENTNIK;  // создали временную структуру для нового клиента
                                           // == Забиваем данные ==//
    newClient->_id_client = id;
    newClient->_task_count = 0;
    newClient->_filename = " ";
    _client.push_back(newClient);  // добавляем нового клиента в массив (вектор)
    return true;
}
 
bool XML_TEMPLATENIK::CreateDocument(_In_ int id, _In_ const char* filename)
{
    if (_proverkaID(id) == false)
    {
        return false;
    }
    _client[id]->_filename = filename;
    // == Создаем узлы ==//
    xml_node n = _client[id]->_doc.append_child("TASK_BASE");  // главный узел
    _client[id]->_task = n.append_child("tasks");  // дочерний узел
    if (_client[id]->_doc.save_file(filename) == false)  // сохраним файл save_file();
    //  _printLog("\nОшибка сохранения файла: %s, уникальный ID клиента :'%i'. Функция CreateDocument \n", filename, id);
    {
    }
    else
    {
    }
    //  _printLog("\nСоздан файл: %s, уникальный ID клиента :'%i'. Функция CreateDocument \n", filename, id);
    return true;
}
 
 
bool XML_TEMPLATENIK::AddZadanie(_In_ int id, _In_ const int nomerZadanie, _In_ const char* otvetZadanie, _In_ const char* textZadanie, _In_ const char * typeZadanie, _In_ const char * teamZadanie, _In_ const char * zametkaZadanie, _In_ const char * tochnZadanie, _In_ const char * peremZadanie, _In_ const char * slZadanie, _In_ const char * trZadanie)
{
    if (_proverkaID(id) == false)
    {
        return false;
    }
    char task_name[12];
    char task_zadanie[12];
    sprintf_s(task_name, "task_%0*i\0", 3, nomerZadanie);
    sprintf_s(task_zadanie, "Z%i\0", nomerZadanie + 1);
 
    bool is_empty = true;
    for (xml_node curr = _client[id]->_task.first_child(); curr; curr = curr.next_sibling())
    {
        if (strcmp(curr.name(), task_name) == 0)
        {
            is_empty = false;
        }
    }
    if (is_empty)
    {
        // add description node with text child
        xml_node param = _client[id]->_task.append_child(task_name);  // создаем дочерний узел
        param.text().set(textZadanie);  // вставляем текст
                                        // == добавляем атрибуты == //
 
        param.append_attribute("zadanie").set_value(task_zadanie);
        param.append_attribute("type").set_value(typeZadanie);
        param.append_attribute("otvet").set_value(otvetZadanie);
        param.append_attribute("Tema").set_value(teamZadanie);
        param.append_attribute("zametka").set_value(zametkaZadanie);
        param.append_attribute("tohnost").set_value(tochnZadanie);
        param.append_attribute("value").set_value(peremZadanie);
        param.append_attribute("slognost").set_value(slZadanie);
        param.append_attribute("time").set_value(trZadanie);
        _client[id]->_task_count++;
    }
    else
    {
        // Обновить данные
        xml_node param = _client[id]->_task.child(task_name);  // Ничего не делаем с именем
        param.text().set(textZadanie);  // заменяем текст
                                        // == заменяем атрибуты == /
        param.attribute("zadanie").set_value(task_zadanie);
        param.attribute("type").set_value(typeZadanie);
        param.attribute("otvet").set_value(otvetZadanie);
        param.append_attribute("Tema").set_value(teamZadanie);
        param.append_attribute("zametka").set_value(zametkaZadanie);
        param.append_attribute("tohnost").set_value(tochnZadanie);
        param.append_attribute("value").set_value(peremZadanie);
        param.append_attribute("slognost").set_value(slZadanie);
        param.append_attribute("time").set_value(trZadanie);
    }
 
    _client[id]->_doc.save_file(_client[id]->_filename.c_str());  // сохраним то что добавили
//  _printLog("\nДанные добавленны в файл: %s, уникальный ID клиента :'%i'. Функция CreateDocument \n", typeZadanie, id);
    return true;
}
и в коде я ее вызываю соответственно :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool FirsIter = true;
            int countZadanOrVar = 0;
            char * NameVar = new char[LOW_BYTE];
            sprintf_s(NameVar, LOW_BYTE,"B%i.xml", XmlCreateVar.countVarik+2);
            INT indexes = (INT)SendDlgItemMessageA(hDlg, IDC_LISTVariKR, (UINT)LB_GETCOUNT, (WPARAM)(0), (LPARAM)(0));// колличество задач
            XmlCreateVar.CreateClientId(XmlCreateVar.countVarik);
            XmlCreateVar.CreateDocument(XmlCreateVar.countVarik, NameVar);
            for (int th = 0; th < indexes; th++)
            {   
                XmlCreateVar.AddZadanie(XmlCreateVar.countVarik, countZadanOrVar, GnrRuh._Task[countZadanOrVar]->_otvetZ, GnrRuh._Task[countZadanOrVar]->_textZ, GnrRuh._Task[countZadanOrVar]->_codeZ,GnrRuh._Task[countZadanOrVar]->_teamZ,GnrRuh._Task[countZadanOrVar]->_zametkaZ,GnrRuh._Task[countZadanOrVar]->_tohnostZ,GnrRuh._Task[countZadanOrVar]->_peremenZ,GnrRuh._Task[countZadanOrVar]->_slognostZ,GnrRuh._Task[countZadanOrVar]->_trudZ);
                countZadanOrVar++;
            }
            delete[] NameVar;
            XmlCreateVar.countVarik++;
Дак при сохранении файла, по каким то причинам (не всегда) русские символы превращаются в кракозябры (в самом файле), смотрю отладчиком -> в переменных все хорошо. Может кто сможет подсказать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru