• xml 单例类


    MD5JSON.h

    复制代码
    #pragma once
    #include "include/json/json.h"
    #include "include/md5/md5.h"
    #include "xml/tinyxml/tinystr.h"
    #include "xml/tinyxml/tinyxml.h"
    #include <string>
    using namespace std;
    
    #pragma comment(lib,"md5_JSON\include\bin\json_vc71_libmtd.lib")
    #define MJ  MD5JSON::getInstance()
    #define JSON Json
    #define XM XML::getInstance()
    
    //      //多线程调试 (/MTd)
    class MD5JSON
    {
        //md5
        md5_state_t m_context;
        unsigned char m_Digest[16];
        char m_outstr[256];
        //json
        char *buf;
        Json::Reader reader;
        Json::Value root;
        string m_jsonfilename;
        Json::Value jsonItem;
    public:
        /////////////////////////  MD5
        static MD5JSON *getInstance();
    
        bool setmd5(const char *data);
    
        bool setmd5(const char *data, char *buffer, int bufferLen);
    
        bool setmd5(const char *data, int datalen);
    
        bool setmd5(string data);
    
        bool setmd5(string data, char *buffer, int bufferLen);
    
        void print();
    
        void print(char *data);
    
        void print(string data);
    
        void print(const char *data);
    
        char *getmd5() { return m_outstr; }
    
    public:
        /////////////////////////  JSON
        bool createJSONFile(const char *filename);
        bool createJSONFile(string filename);
        string getFileName() { return m_jsonfilename; }
        Json::Value getRoot() { return this->root; }
        Json::Value getItem() { return this->jsonItem; }
        bool readJSONFile(const char *filename);
        bool readJSONFile(string filename);
        //直接写入文件
        bool insertData(const char *data);
        //json 方法写入并baocun
        bool insertData();
        //如果相同则覆盖
        //==================================================
        bool addChild(const char *key,const char *value);
        bool addChild(string key, string value);
        //MD5JSON::insertData(); 内部已经调用
        void addChildEnd();
        //==================================================
    
        char *getJSONData() { return buf; }
        //在加载文件时此函数就已经调用
        bool parseJSON();
        //这里只有在一个root下才有效
        int get_int(const char *key);
        string get_string(const char *key);
        unsigned int get_uint(const char *key);
        double get_double(const char *key);
        bool get_bool(const char *key);
        const char *get_const_string(const char *key);
        //清楚整个文件数据
        void clear();
    
        //遍历
        void ergodicObject(Json::Value::Members &object);
        void ergodicObject(Json::Value &root, Json::Value::Members &object);
        //数组遍历
        void ergodicArray(Json::Value &root);
    private:
        //f30992da54715e5a0c4a7eaf29889641  //vico
    
        MD5JSON()
        {
            this->m_context = { 0 };
            memset(this->m_Digest, 0, sizeof(this->m_Digest));
            memset(this->m_outstr, 0, sizeof(this->m_outstr));
        }
        ~MD5JSON()
        {
            if (buf)
            {
                delete[] buf;
                buf = NULL;
            }
        }
    };
    
    
    class XML
    {
        string name;
        TiXmlDocument* Doc;
    public:
        static XML *getInstance();
        string setXMLName(string name);
        bool createXML();
        bool createXML(string name);
        bool loadXML(string name);
        //Accout Password
        bool insert(string A, string P);
        bool save();
        bool saveToNewFile(string name);
        //node 除非你知道在做什么
        bool addChild(string node, string key, string value);
        //Accout AccoutValue Password PasswordValue
        bool addChild(string A, string AV,string P,string PV);
    
    private:
        XML();
        ~XML();
    };
    复制代码

    MD5JSON.cpp

    复制代码
    #include "MD5JSON.h"
    
    /////////////////////////  MD5
    MD5JSON *MD5JSON::getInstance()
    {
        static MD5JSON md5json;
        return &md5json;
    }
    
    bool MD5JSON::setmd5(const char *data)
    {
        if (data)
        {
            md5_byte_t byteData[256] = { 0 };
            memset(byteData, 0, sizeof(byteData));
            int len = 0;
            while (data[len])
            {
                byteData[len] = data[len];
                len++;
            }
            /*
                pms->abcd[1] = /*0xefcdab89 // T_MASK ^ 0x10325476;
                pms->abcd[2] = /*0x98badcfe // T_MASK ^ 0x67452301;
            */
            md5_init(&m_context);
            md5_append(&m_context, byteData, len);
            md5_finish(&m_context, m_Digest);
    
            sprintf_s(m_outstr,
                "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                m_Digest[0], m_Digest[1], m_Digest[2], m_Digest[3], m_Digest[4], m_Digest[5],
                m_Digest[6], m_Digest[7], m_Digest[8], m_Digest[9], m_Digest[10], m_Digest[11],
                m_Digest[12], m_Digest[13], m_Digest[14], m_Digest[15]);
            return true;
        }
        return false;
    }
    
    bool MD5JSON::setmd5(const char *data, char *buffer, int bufferLen)
    {
        if (data && buffer && bufferLen)
        {
            md5_byte_t byteData[256] = { 0 };
            memset(byteData, 0, sizeof(byteData));
            int len = 0;
            while (data[len])
            {
                byteData[len] = data[len];
                len++;
            }
            /*
                pms->abcd[1] = /*0xefcdab89 // T_MASK ^ 0x10325476;
                pms->abcd[2] = /*0x98badcfe // T_MASK ^ 0x67452301;
            */
            md5_init(&m_context);
            md5_append(&m_context, byteData, len);
            md5_finish(&m_context, m_Digest);
    
            sprintf_s(m_outstr,
                "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                m_Digest[0], m_Digest[1], m_Digest[2], m_Digest[3], m_Digest[4], m_Digest[5],
                m_Digest[6], m_Digest[7], m_Digest[8], m_Digest[9], m_Digest[10], m_Digest[11],
                m_Digest[12], m_Digest[13], m_Digest[14], m_Digest[15]);
            strcpy_s(buffer, bufferLen, m_outstr);
            return true;
        }
        return false;
    }
    
    bool MD5JSON::setmd5(const char *data, int datalen)
    {
        if (data && datalen)
        {
            md5_byte_t byteData[256] = { 0 };
            memset(byteData, 0, sizeof(byteData));
            while (data[datalen - 1])
            {
                byteData[datalen - 1] = data[datalen - 1];
                datalen--;
            }
            /*
                pms->abcd[1] = /*0xefcdab89 // T_MASK ^ 0x10325476;
                pms->abcd[2] = /*0x98badcfe // T_MASK ^ 0x67452301;
            */
            md5_init(&m_context);
            md5_append(&m_context, byteData, datalen - 1);
            md5_finish(&m_context, m_Digest);
    
            sprintf_s(m_outstr,
                "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                m_Digest[0], m_Digest[1], m_Digest[2], m_Digest[3], m_Digest[4], m_Digest[5],
                m_Digest[6], m_Digest[7], m_Digest[8], m_Digest[9], m_Digest[10], m_Digest[11],
                m_Digest[12], m_Digest[13], m_Digest[14], m_Digest[15]);
            return true;
        }
        return false;
    }
    
    bool MD5JSON::setmd5(string data)
    {
        return MD5JSON::setmd5(data.c_str());
    }
    
    bool MD5JSON::setmd5(string data, char *buffer, int bufferLen)
    {
        return MD5JSON::setmd5(data.c_str(),buffer,bufferLen);
    }
    
    void MD5JSON::print()
    {
        printf("%s
    ", m_outstr);
    }
    
    void MD5JSON::print(char *data)
    {
        printf("%s
    ", data);
    }
    
    void MD5JSON::print(string data)
    {
        printf("%s
    ", data.c_str());
    }
    
    void MD5JSON::print(const char *data)
    {
        printf("%s
    ", data);
    }
    
    /////////////////////////  JSON
    bool MD5JSON::createJSONFile(const char *filename)
    {
        m_jsonfilename = filename;
        FILE *File = NULL;
        fopen_s(&File, filename, "wb");
        if (File)
        {
            fclose(File);
            File = NULL;
            return true;
        }
        return false;
    }
    
    bool MD5JSON::createJSONFile(string filename)
    {
        return MD5JSON::createJSONFile(filename.c_str());
    }
    
    bool MD5JSON::readJSONFile(const char *filename)
    {
        
        m_jsonfilename = filename;
        FILE *File = NULL;
        fopen_s(&File, filename, "rb");
        if (File)
        {
            rewind(File);
            //从0开始偏移到最后
            fseek(File, 0, SEEK_END);
            int size = ftell(File);
            //rewind(File);
            //从0开始偏移到0的位置
            fseek(File, 0, SEEK_SET);
            //文件当前读写位置
            //fseek(File, 0, SEEK_CUR);
    
            buf = new char[size + 1];
            int read = fread_s(buf, size + 1, size, 1, File);
            rewind(File);
    
            fclose(File);
            File = NULL;
            return MD5JSON::parseJSON();
        }
        return false;
    }
    
    bool MD5JSON::readJSONFile(string filename)
    {
        return MD5JSON::readJSONFile(filename.c_str());
    }
    
    bool MD5JSON::insertData(const char *data)
    {
        FILE *File = NULL;
        fopen_s(&File, this->m_jsonfilename.c_str(), "wb+");
        if (File)
        {
            int len = strlen(data);
            fwrite(data, len, 1, File);
            fclose(File);
            File = NULL;
            return true;
        }
        return false;
    }
    
    bool MD5JSON::insertData()
    {
        return MJ->insertData(this->root.toStyledString().c_str());
    }
    
    bool MD5JSON::addChild(const char *key, const char *value)
    {
        if (key && value)
        {
            jsonItem[key] = value;
            return true;
        }
        return false;
    }
    
    bool MD5JSON::addChild(string key, string value)
    {
        return MD5JSON::addChild(key.c_str(), value.c_str());
    }
    
    void MD5JSON::addChildEnd()
    {
        this->root.append(jsonItem);
        MD5JSON::insertData();
    }
    
    bool MD5JSON::parseJSON()
    {
        if (this->reader.parse(MJ->getJSONData(), this->root))
        {
            Json::Value::Members member = this->root.getMemberNames();
            MD5JSON::ergodicObject(this->root,member);
    
            //int size_i = member.size();
            //for (int i = 0; i < size_i; i++)
            //{
            //    if (this->root[member[i].c_str()].isObject())
            //    {
            //        Json::Value::Members temp = this->root[member[i].c_str()].getMemberNames();
            //        MD5JSON::ergodicObject(this->root[member[i].c_str()],temp);
            //        int size_j = temp.size();
            //        for (int j = 0; j < size_j; j++)
            //        {
            //            if ((this->root[member[i].c_str()])[temp[j].c_str()].isObject())
            //            {
            //                Json::Value::Members tmp = (this->root[member[i].c_str()])[temp[j].c_str()].getMemberNames();
            //                MD5JSON::ergodicObject(this->root[member[i].c_str()][temp[j].c_str()],tmp);
            //                int size_k = tmp.size();
            //                for (int k = 0; k < size_k; k++)
            //                {
            //                    if ((this->root[member[i].c_str()])[temp[j].c_str()][tmp[k].c_str()].isObject())
            //                    {
            //                        Json::Value::Members tm = ((this->root[member[i].c_str()])[temp[j].c_str()])[tmp[k].c_str()].getMemberNames();
            //                        MD5JSON::ergodicObject(this->root[member[i].c_str()][temp[j].c_str()][tmp[k].c_str()], tm);
            //                        int size_n = tm.size();
            //                        for (int n = 0; n < size_n; n++)
            //                        {
            //                            if ((this->root[member[i].c_str()])[temp[j].c_str()][tmp[k].c_str()][tm[n].c_str()].isObject())
            //                            {
            //                                Json::Value::Members t = (((this->root[member[i].c_str()])[temp[j].c_str()])[tmp[k].c_str()])[tm[n].c_str()].getMemberNames();
            //                                MD5JSON::ergodicObject(this->root[member[i].c_str()][temp[j].c_str()][tmp[k].c_str()][tm[n].c_str()], t);
            //                            }
            //                        }
            //                    }
            //                }
            //            }
            //        }
            //    }
            //}
            return true;
        }
        return false;
    }
    
    void MD5JSON::ergodicObject(Json::Value::Members &object)
    {
        int size = object.size();
        for (int i = 0; i < size; i++)
        {
            std::cout << object[i] << std::endl;
        }
    }
    
    void MD5JSON::ergodicObject(Json::Value &root, Json::Value::Members &object)
    {
        int size = object.size();
        for (int i = 0; i < size; i++)
        {
            if (root[object[i].c_str()].isArray())
            {
                std::cout << "Key = " << object[i] << "    ,      Value = Array"<< std::endl;
    
                //遇到数组对象一直进行递归
                MD5JSON::ergodicArray(root[object[i].c_str()]);
            }
            else if (root[object[i].c_str()].isBool())
            {
                std::cout << "Key = " << object[i] << "    ,      Value = " << root[object[i].c_str()].asBool() << std::endl;
            }
            else if (root[object[i].c_str()].isDouble())
            {
                std::cout << "Key = " << object[i] << "    ,      Value = " << root[object[i].c_str()].asDouble() << std::endl;
            }
            else if (root[object[i].c_str()].isInt())
            {
                std::cout << "Key = " << object[i] << "    ,      Value = " << root[object[i].c_str()].asInt() << std::endl;
            }
            else if (root[object[i].c_str()].isString())
            {
                std::cout << "Key = " << object[i] << "    ,      Value = ";
                printf("%s
    ", root[object[i].c_str()].asString().c_str());
    
            }
            else if (root[object[i].c_str()].isObject())
            {
                std::cout << "Key = " << object[i] << "    ,      Value = Object"<< std::endl;
    
                //遇到对象一直进行递归
                Json::Value::Members tmp = root[object[i].c_str()].getMemberNames();
                MD5JSON::ergodicObject(root[object[i].c_str()], tmp);
            }
        }
    }
    
    void MD5JSON::ergodicArray(Json::Value &root)
    {
        int size = root.size();
        for (int i = 0; i < size; i++)
        {
            string str = root[i].toStyledString();
            //printf("%s
    ", str.c_str());
            Json::Value::Members tmp = root[i].getMemberNames();
            MD5JSON::ergodicObject(root[i], tmp);
        }
    }
    
    int MD5JSON::get_int(const char *key)
    {
        if (root[key].isInt())
            return root[key].asInt();
        return 0;
    }
    
    string MD5JSON::get_string(const char *key)
    {
        if (root[key].isString())
            return root[key].asString();
        string str;
        return str;
    }
    
    unsigned int MD5JSON::get_uint(const char *key)
    {
        if (root[key].isUInt())
            return root[key].asUInt();
        return -1;
    }
    
    double MD5JSON::get_double(const char *key)
    {
        if (root[key].isDouble())
            return root[key].asDouble();
        return -1.0;
    }
    
    bool MD5JSON::get_bool(const char *key)
    {
        if (root[key].isBool())
            return root[key].asBool();
        return false;
    }
    
    const char *MD5JSON::get_const_string(const char *key)
    {
        if (root[key].isString())
            return root[key].asCString();
        return NULL;
    }
    
    void MD5JSON::clear()
    {
        FILE *File = NULL;
        fopen_s(&File, this->m_jsonfilename.c_str(), "rb");
        if (File)
        {
            fclose(File);
            File = NULL;
            string head("del ");
            head += this->m_jsonfilename;
            int c = system(head.c_str());
            if (!c)
            {
                MJ->createJSONFile(this->m_jsonfilename.c_str());
                delete[] buf;
                buf = NULL;
                return;
            }
        }
        MJ->createJSONFile(this->m_jsonfilename.c_str());
        delete[] buf;
        buf = NULL;
    }
    
    
    /////////////////////////////////////////////////////////            XML
    
    XML *XML::getInstance()
    {
        static XML xml;
        return &xml;
    }
    
    string XML::setXMLName(string name)
    {
        this->name.clear();
        return this->name = name;
    }
    
    bool XML::createXML()
    {
        //加载成功
        if (!Doc->LoadFile(this->name.c_str()))
        {
            return Doc->SaveFile(this->name.c_str());
        }
        return false;
    }
    
    bool XML::createXML(string name)
    {
        //加载成功
        if (!Doc->LoadFile(name.c_str()))
        {
            return Doc->SaveFile(name.c_str());
        }
        return false;
    }
    
    bool XML::loadXML(string name)
    {
        XML::createXML(name);
    
        TiXmlElement* e = NULL;
        for (e = Doc->FirstChildElement("Node"); e != NULL; e = e->NextSiblingElement())
        {
            if (e)
            {            
                std::cout << "Account : " << e->Attribute("Account") << ", Password : " << e->Attribute("Password") << std::endl;
            }
        }
        return false;
    }
    
    bool XML::insert(string A, string P)
    {
        TiXmlElement* e = new TiXmlElement("Node");
        e->SetAttribute("Account",A.c_str());//得到玩家账号
        e->SetAttribute("Password", P.c_str());//得到玩家密码
        Doc->LinkEndChild(e);//存入文档
        //保存到文档
        return Doc->SaveFile(this->name.c_str());
    }
    
    bool XML::save()
    {
        return Doc->SaveFile(this->name.c_str());
    }
    
    bool XML::saveToNewFile(string name)
    {
        return Doc->SaveFile(name.c_str());
    }
    
    bool XML::addChild(string node, string key, string value)
    {
        TiXmlElement* e = new TiXmlElement(node.c_str());
        e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        Doc->LinkEndChild(e);//存入文档
        //保存到文档
        return Doc->SaveFile(this->name.c_str());
    }
    
    bool XML::addChild(string A, string AV, string P, string PV)
    {
        TiXmlElement* e = new TiXmlElement("Node");
        e->SetAttribute(A.c_str(), AV.c_str());
        e->SetAttribute(P.c_str(), PV.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        //e->SetAttribute(key.c_str(), value.c_str());
        Doc->LinkEndChild(e);//存入文档
        //保存到文档
        return Doc->SaveFile(this->name.c_str());
    }
    
    XML::XML()
    {
        name = "XML_FILE.xml";
        Doc = new TiXmlDocument();
    }
    
    XML::~XML()
    {
        if (Doc)
        {
            delete Doc;
            Doc = NULL;
        }
        if (!name.empty())
        {
            name.clear();
        }
    }
    复制代码
  • 相关阅读:
    python list间的并集、差集与交集
    kafka常用命令,启动/停止/查看主题列表/消费/生产
    python json
    lrzsz
    HashMap实现原理,源码分析
    Java中try catch finally语句中含有return语句的执行情况
    Maven
    我的面试题
    JSON数据格式
    springMVC2
  • 原文地址:https://www.cnblogs.com/YZFHKMS-X/p/11780605.html
Copyright © 2020-2023  润新知