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

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

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

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

29.12.2015, 07:40. Просмотров 228. Ответов 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 файла
Посмотрите здесь:

Сохранение кодировки при чтении XML-файла - C++
Всем привет :) Прошу знающих людей помочь советом, или просто пальцем ткнуть в литературу, только пожалуйста, поподробнее, а то я совсем...

Сохранение файла в С++ - C++
Вот прога была написана на Си. И щас переписал на С++ и не знаю ,что делать с сохранеием файла. Помогите исправить ошибку. Сам пишу...

Открытие и сохранение файла - C++
Привет всем, подскажыте как открыть файл в С++ без Опен диалога и как збереч его, при етом с файла нужно считать инфу. (Файл в форматие...

Динамическое сохранение информации из файла - C++
Добрый вечер! Хочу считать информацию из файла заранее неизвестного размера. Не хочу определять огромный массив char ch , поэтому 2...

сохранение и обработка файла HTML - C++
хочу сделать программу которая будет сохранять страницу HTML файлом а потом откроет ее в текстовом файле и проанализирует исходный код. ...

Изменение и сохранение текстового файла - C++
Дан текстовый файл, содержащий 100 строк. Программа запрашивает у пользователя, что необходимо сделать: a) удалить каждую четную строку ...

Сохранение файла в нужную папку - C++
Как задать путь, чтобы файл открывался и сохранялся в папку, которая лежит в директории проекта без указания полного пути к ней, чтобы при...

Чтение и сохранение JPEG файла - C++
Как прочитать файл формата .jpg, а потом обработанное(уже мной!) сохранить???

Сохранение и считывания списка с текстового файла - C++
Всем привет! Ребята я делаю программу по работе со списками и она уже почти готова, по сути всё сделал! Вот только не знаю как сохранить...

Чтение и сохранение данных из конфигурационного файла - C++
Привет всем!! Есть программа на C с конфигурационным файлом!!! Надо сделать так чтобы при старте программы конфиг файл читался один раз,...

Сохранение пикселей в графический формат файла - C++
Добрый день :) на этот раз передо мной встала вот такая задачка: необходимо разбить картинку на несколько частей и каждую часть сохранить...

Сохранение и чтение из файла (база данных) - C++
Добрый Вечер дорогой форум! Огромный поклон за помощь таким новичкам как я! Всегда нахожу то что нужно, но не в данном частном случае. ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
5136 / 4456 / 1486
Регистрация: 14.04.2014
Сообщений: 17,697
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 файла
Ответ Создать тему
Опции темы

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