Когда я сохраняю файл с Rapidxml, я получаю ненужные данные
Простая функция для создания узла объявления в начале и элемента element с именем "List", содержащего 26 elementNode каждый с именем "IP" со случайным IPv4-адресом в виде строкового типа данных в качестве значения узла. Случайный ip происходит из вектора хранения со всеми 26 IP-адресами. Нет проблем с IP и вектором, так как он правильно выводится на консоль.
Чтобы гарантировать, что узлы все еще существуют после вызова метода, я сохраняю их в векторе извне функции, хотя я почти уверен, что это ничего не изменит для этого.
Я попытался объявить строку ip внутри цикла и присвоить значение переменной внутри цикла, так как это могло бы раскрыть информацию. Это ничего не меняет.
Кроме того, я попытался по-разному назвать каждый IP-узел с номером в виде строки. Это худшее, поскольку это выводит чистый мусор.
Я получил несколько подсказок, чтобы сделать мой вопрос лучше, поэтому я отредактировал код. Сейчас все в основном, и это все, что есть.
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include <Dependencies/Rapidxml/rapidxml.hpp>
#include <Dependencies/Rapidxml/rapidxml_utils.hpp>
#include <Dependencies/Rapidxml/rapidxml_print.hpp>
#include "IPV4.h"
int8_t ComputerQty = 25;
std::vector<rapidxml::xml_node<>*> IPVec;
std::vector<IPV4> IPVector;
std::string FilePath = "C:/Users/Bob/Documents/Visual Studio 2017/Projects/UtryonWithIrrLicht/Files/IPList.xml";
int main(int argc, char** argv)
{for (size_t A = 0; A < ComputerQty + 1; A++)
{IPV4 NewIP = IPV4();
NewIP.SetRandomIP();
IPVector.push_back(NewIP);
bool IpCollision = true;
while (IpCollision)
{IpCollision = false;
size_t Size = IPVector.size();
for(size_t B = 0; B < Size; B++)
{if (A != B)
{if (IPVector[A].GetIP() == IPVector[B].GetIP())
{IpCollision = true;
if (A < B)
{IPVector[B].SetRandomIP();}
}
}
}
}
}
rapidxml::xml_document<> Doc;
rapidxml::xml_node<>* Decl = Doc.allocate_node(rapidxml::node_declaration);
Decl->append_attribute(Doc.allocate_attribute("version", "1.0"));
Decl->append_attribute(Doc.allocate_attribute("encoding", "utf-8"));
Doc.append_node(Decl);
rapidxml::xml_node<>* List = Doc.allocate_node(rapidxml::node_element, "List");
Doc.append_node(List);
for (size_t A = 0; A < ComputerQty + 1; A++)
{std::cout << "IPVector[A].GetIP() = " << IPVector[A].GetIP() << std::endl;
IPVec.push_back(Doc.allocate_node(rapidxml::node_element, "IP", IPVector[A].GetIP().c_str()));
List->append_node(IPVec[A]);
}
std::ofstream theFile(FilePath);
theFile << Doc;
theFile.close();
Doc.clear();
}
Вот результирующий файл на Notepad++.
Прежде всего, что это за странные персонажи и откуда они берутся? Никогда не видел ничего подобного. Тогда почему есть некоторые недостающие части IP? Наконец, почему это всегда один и тот же IP?
1 ответ
Я нашел ответ сам. Оказывается, что конструктор Node не принимает std:: string, хотя вы можете это сделать, и это нигде не вызовет ошибок. Это только даст ужасный результат. Вы должны обернуть std:: string в allocate_string(my_string)
функция, когда вы передаете его конструктору в качестве аргумента. Кажется, что rapidxml каким-то образом обрабатывает строку и изменяет ее до желаемого формата. Я сделал, чтобы вывод был идеальным.
Я просто изменил эту строку:
IPVec.push_back(Doc.allocate_node(rapidxml::node_element,
"IP",
IPVector[A].GetIP().c_str()));
Для этой строки:
IPVec.push_back(Doc.allocate_node(rapidxml::node_element,
"IP",
Doc.allocate_string(IPVector[A].GetIP().c_str()));