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

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

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

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

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

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

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

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

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

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

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

2
nmcf
6110 / 5421 / 1892
Регистрация: 14.04.2014
Сообщений: 22,602
29.12.2015, 12:29 #2
В какой кодировке записываешь? Пример данных какой-то приведи.
0
Ника))
41 / 41 / 8
Регистрация: 08.12.2010
Сообщений: 339
30.12.2015, 07:18  [ТС] #3
Кодировка ни где не указывается...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2015, 07:18
Привет! Вот еще темы с ответами:

Загрузка и сохранение BMP файла - C++
Добрый день! Мне нужно загружать, а затем сохранять BMP файл, пока без обработки, просто загрузить в массив и потом из этого массива...

Сохранение файла на уровне потока - C++
Как из этой функции сохранения файла на уровне операционки сделать функцию сохранения файла на уровне потока? int Save(char* fileName,...

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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