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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ника))
 Аватар для Ника))
41 / 41 / 8
Регистрация: 08.12.2010
Сообщений: 339
#1

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

29.12.2015, 07:40. Просмотров 181. Ответов 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++;
Дак при сохранении файла, по каким то причинам (не всегда) русские символы превращаются в кракозябры (в самом файле), смотрю отладчиком -> в переменных все хорошо. Может кто сможет подсказать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2015, 07:40     Сохранение Xml файла
Посмотрите здесь:

C++ сохранение и обработка файла HTML
C++ Сохранение файла в С++
Открытие и сохранение файла C++
Сохранение пикселей в графический формат файла C++
C++ Чтение и сохранение данных из конфигурационного файла
C++ Чтение и сохранение JPEG файла
Сохранение файла в нужную папку C++
Изменение и сохранение текстового файла C++
C++ Сохранение и считывания списка с текстового файла
C++ Динамическое сохранение информации из файла
Сохранение кодировки при чтении XML-файла C++
Сохранение и чтение из файла (база данных) C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4468 / 3806 / 1285
Регистрация: 14.04.2014
Сообщений: 14,946
29.12.2015, 12:29     Сохранение Xml файла #2
В какой кодировке записываешь? Пример данных какой-то приведи.
Ника))
 Аватар для Ника))
41 / 41 / 8
Регистрация: 08.12.2010
Сообщений: 339
30.12.2015, 07:18  [ТС]     Сохранение Xml файла #3
Кодировка ни где не указывается...
Yandex
Объявления
30.12.2015, 07:18     Сохранение Xml файла
Ответ Создать тему
Опции темы

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