Когда я сохраняю файл с Rapidxml, я получаю ненужные данные - PullRequest
0 голосов
/ 03 февраля 2019

Простая функция для создания узла объявления в начале и элемента 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 ++.A list of IPs except most start and end with NUL, a few have b's at the end, and a few have digits missing from the end.

Прежде всего, что это за странные персонажи и откуда они берутся?Никогда не видел ничего подобного.Тогда почему есть некоторые недостающие части IP?Наконец, почему это всегда один и тот же IP?

1 Ответ

0 голосов
/ 04 февраля 2019

Я нашел ответ сам.Оказывается, что конструктор 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()));
...