美文网首页
ini解析器

ini解析器

作者: 码农练功房 | 来源:发表于2021-08-06 16:50 被阅读0次

项目中需要用到解析ini格式的配置,手撸了一个:

static bool Startwith(const string&src, const string&str)
{
    return src.compare(0, str.size(), str) == 0;
}

static void Trim(string &s)  //去除字符两端空格
{
    if (s.empty())
    {
        return;
    }
    s.erase(0, s.find_first_not_of(" "));
    s.erase(s.find_last_not_of(" ") + 1);
}

class IniFileParser
{
public:
    IniFileParser(const string& data)
    {
        istringstream strin(data);
        string line;
        while (getline(strin, line, '\n'))// 将字符以行形式存储;
        {
            Trim(line);
            //默认以 '#', '-', '/', ';'开头的行为注释,过滤掉这些注释;
            if (Startwith(line, "#") || Startwith(line, "-") || Startwith(line, "/") || Startwith(line, ";"))
                continue;
            lines.push_back(line);
        }
    }

    string GetValue(const char* sectionName, const string&key)
    {
        UpdateContent(sectionName);
        auto iter = content.find(key);
        if (iter != content.end())
            return iter->second;
        return string();
    }
private:
    vector<string>::const_iterator FindSectionBeg(const char* sectionName)
    {
        string sectionTitle = string("[") + string(sectionName) + string("]");
        return find(lines.begin(), lines.end(), sectionTitle);
    }

    vector<string>::const_iterator FindSectionEnd(const char* sectionName)
    {
        auto lineBeg = FindSectionBeg(sectionName);
        if (lineBeg == lines.end())
            return lines.end();
        auto iter = lineBeg + 1;  // 另起一行,找下一个section
        for (; iter != lines.end(); ++iter)
        {
            const string& line = *iter;
            if (Startwith(line, "["))
                return iter;
        }
        // 没有找到下一个section,说明sectionName已经是最后一个section
        return lines.end();
    }

    void UpdateContent(const char* sectionName)
    {
        auto lineBeg = FindSectionBeg(sectionName);
        auto lineEnd = FindSectionEnd(sectionName);
        FillContent(lineBeg, lineEnd);
    }

    void FillContent(vector<string>::const_iterator beg, 
                     vector<string>::const_iterator end)
    {
        content.clear();
        vector<string>::const_iterator iter = beg;
        for (; iter != end; ++iter)
        {
            const string& line = *iter;
            string::size_type pos = line.find("=");
            if (pos == string::npos)
                continue;
            string key = line.substr(0, pos);
            Trim(key);
            string value = line.substr(pos + 1);
            Trim(value);
            content[key] = value;
        }
    }
private:
    vector<string> lines;  // 包含空行
    map<string, string> content; // section的key value数据;
};

要解析的ini文件内容:

[mysql]
addr=127.0.0.1
user=root
psw=root
port=3306
dbname=db

以下是IniFileParser使用demo:

int main()
{
    string path = GetCfgFilePath();  // GetCfgFilePath自己实现
    ifstream inputFile(path, ios::in);
    if (!inputFile.is_open())
    {
        return 0;
    }
    std::string fileData((std::istreambuf_iterator<char>(inputFile)), std::istreambuf_iterator<char>());
    IniFileParser iniParser(fileData);
    
    string ip = iniParser.GetValue("mysql", "addr");
    string userName = iniParser.GetValue("mysql", "user");
    string password = iniParser.GetValue("mysql", "psw");
    string strPort = iniParser.GetValue("mysql", "port");
    string dbName = iniParser.GetValue("mysql", "dbname");
    return 0;
}

相关文章

  • ini解析器

    项目中需要用到解析ini格式的配置,手撸了一个: 要解析的ini文件内容: 以下是IniFileParser使用d...

  • ini文件

    什么是ini文件?ini文件的组成?ini文件的作用? 1、什么是ini文件?.ini 文件是Initializa...

  • 2017-06-10-Android XML解析

    Android xml解析 1,SAX解析器 2,Dom解析器 3,pull解析器

  • 解析器模式 与 免费公交卡

    解析器模式,它能用在什么地方呢? 解析器模式,它是如何解析的? 解析器模式,它有哪些关键要素? 解析器模式(Int...

  • python网页解析器

    python 之网页解析器 一、什么是网页解析器 1、网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简...

  • 2019-09-19

    Shell 概述 Shell 解析器 查看系统shell解析器 默认解析器为bash Shell 脚本入门 新建h...

  • XML3 - XML解析编程

    JAXP解析 JAXP的DOM解析 由解析器工厂类获取解析器工厂 解析器工厂产生一个解析器 解析XML,获得一个D...

  • config.ini

    使用configparser读写config.ini文件 读取config.ini文件 写入config.ini文...

  • frp服务配置

    进入目录中可以看到 frpc frpc_full.ini frpc.ini frps frps_full.ini ...

  • SpringMVC上传图片

    配置解析器 jar包CommonsMultipartResolver解析器 commons-fileupload和...

网友评论

      本文标题:ini解析器

      本文链接:https://www.haomeiwen.com/subject/szqivltx.html