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

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

Восстановить пароль Регистрация
 
Ника))
 Аватар для Ника))
39 / 39 / 8
Регистрация: 08.12.2010
Сообщений: 338
29.12.2015, 07:40     Сохранение Xml файла #1
Вот есть небольшой класс для создания и редактирования 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++ Чтение и сохранение JPEG файла
Сохранение файла в нужную папку C++
Изменение и сохранение текстового файла C++
C++ Сохранение и считывания списка с текстового файла
C++ Динамическое сохранение информации из файла

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

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

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