在C 进行控告,常常理由修正必然的变量以了解意见分歧的功用。,这是cfg文件的运用可以使得工程更其高效与实用的,冠词引见的执意c++读取cfg文件的有关主题,即时总结和评论。

  STL是基准模板库,它牵制大量的根本的数据建筑风格和根本算法。,了解了软件的高重用,在基准中,STL牵制13个头文件,包含

等。 

  有探察都有必然的部件应变量,牵制默许构造的应变量、完全一样的构造的应变量、析构应变量、空(决定探察即使为空)、最大使满足(循环探察最大使满足)、大块(探察循环的普遍地等同)、相互交换(两个探察射中靶子元素相互交换)。大量的探察也早已开端了。、end、rbegin、rend、erase、确切的和那个办法迅速的获取元素经过。。在这里首要引见小块地探察。。

  MAP是每一关系的探察,是映照类的模板,上面的案件演示了小块地的运用,列举如下:

#include 
#include <string>
#include 
usingnamespace std;
int main()
{
    string name[] = {"wanye", "hedy", "jack"};
    double salary[] = {20000, 8000, 1200};
    map<string, double> sal;
    map<string, double>::iterator p; // 构筑映照遍历器for (int i = 0; i < 3; i++) // 将姓名和支付映照到小块地        (MaGuxGIN(清晰度),工钱[我]
    sal["bob"] = 6000;
    sal["mark"] = 7000;
    for ( p = (); p != (); p++)
        cout << p->first << "\t" << p->second << endl;
    cout << "出口理由查找人名" << endl;
    string foo;
    cin >> foo;
    bool b = false;
    for (p = (); p != (); p++)
    {
        if (p->first == FO)
        {
            cout << p->second << endl;
            b = true;
        }
    }
    if (b == false)
    {
        cout << "没职员!" << endl;
    }
    return0;
}

前述事项顺序执意将职员姓名和工钱存入map中,鉴于小块地的用铰链连接点查找小块地的重要性。值当注重的是以下几点:

  • 您可以领会,映照实际的是模板类。,我们家运用提及小块地 实则,这是每一小块地物体的准备。,异样SAL物体亲自有必然的办法,比方开端、end、拔出等。 
  • 字母行库的引入可以准备字母行阻塞。 
  • 因遍历小块地建筑风格,因而你理由设置遍历者迭代器。
  • 运用INSERT办法拔出,体式是:, 酒吧)
  • MAP有两种开端和完毕的办法,二者的循环值故障每一复杂的数字。,它是遍历器的迭代器值。,经过iterator的first和second属性可以地区号召到map的key和value。
  • 而且运用INSERT办法不计,还筹集了MAP。,也可以运用。 下标法 拔出。 
  • 查询映照表时,整个的小块地建筑风格理由遍历。。

小块地引入后,我们家就可以试着读取cfg文件射中靶子进行控告划拨的款项通信了。

率先,我们家要知情cfg文件的体式,权利是权利 key = value 这种体式,而且,我可以用它 # 作为正文的使佩带像章注意。列举如下

#thisis a comment
a = 100
b = 100 #this comment is valid

# thisis another
c = 200

前述事项是正文的两种用法。,同上占有线,可供选择的事物是在K-V后接合点。

这使分裂地,我们家也可以写每一C 进行控告,于是,将有.h和.cp文件,在主顺序CPP文件中,这是每一符合逻辑的顺序,因而,少数办法的清晰度最幸亏那个文档中清晰度。,普通,我们家在.h文件中清晰度它,于是添加到相当的的CPP文件中,这样的事物,在主顺序中,我们家可以引入.h文件来使简易顺序,使顺序的表达更其确切的、高效,列举如下,我们家构筑了一份文件:

#ifndef __GET_CONFIG_H__
#define __GET_CONFIG_H__

#include <string>
#include 
#include 
usingnamespace std;

#define COMMENT_CHAR ''#''

bool ReadConfig(conststring & filename, map <string, string> & m);
void PrintConfig(const map<string, string> & m);
void FindInConfig(map<string, string> m, string 用铰链连接)
#endif

在这里 #define COMMENT 这是每一宏清晰度。,易增加与重构,变高顺序生产力,上面两个句子清晰度了两个应变量,每一是读取划拨的款项通信的应变量,另每一是捣碎有划拨的款项通信的应变量。,在翻阅文献中 & 这是每一翻阅,这故障每一复杂的分派。,它修正决定因素并修正使铭记值。。

  • 我们家在在这里引见的 string、map、iostream,这样的事物,我们家不理由以异样的方法反复。
  • 正文的运用更其确切的易懂。。
  • 在这里清晰度了必然的首要功用。,是为了在运用,了解了有那个功用,而故障边线。

上面是文件的密码:

#include ""

#include 
#include 

usingnamespace std;

bool IsSpace(char c)
{
    if (c == '''' || c == ''\t'')
    {
        returntrue;
    }
    else
    {
        returnfalse;
    }
}

bool IsCommentChar(char c)
{
    if (c == COMMENT_CHAR)
    {
        returntrue;
    }
    else
    {
        returnfalse;
    }
}

// 修剪功用的功用是去除左侧的的坯和钻机。,也执意说,修剪void Trim(string & STR) // 援用翻阅文献,修正应变量射中靶子决定因素也会修正相当的的VARI。{
    if (())
    {
        return;
    }
    int i, start_pos, end_pos;
    for (i = 0; i < (); i++)
    {
        if (!IsSpace(STR)
        {
            break;
        }
    }
    if (i == ())
    {
        str = "";    
        return;
    }
    start_pos = i; // 获取非坯的初始地位for (i = () - 1; i >= 0; i--)
    {
        if (!IsSpace(STR)
        {
            break;
        }
    }
    end_pos = i;
    str = (start_pos, end_pos - start_pos + 1);
}

bool AnalyseLine(conststring & line, string & key, string & 重要性) // 一线辨析,即使它是正文行,不处置,即使是K-V线,于是取出键指定值。{
    if (())
    {
        returnfalse;
    }
    int start_pos = 0, end_pos = () - 1, pos;
    if (POS) = (COMMENT_CHAR)) != -1)
    {
        if (0 == POS)
        {
            returnfalse; // 即使同类的提出是,解说是正文。,则 不理由        }
        end_pos = pos - 1; // 这能够是K-V后正文的每一案件。    }
    string new_line = (start_pos, end_pos - start_pos + 1); // 砍掉正文的后半使分裂 FIX_ME: 这应该是个有毛病。
    // 以下POS的分派是理由的,这样的事物,您可以在配乐获取键指定和值。。if (POS) = new_("=")) == -1) //解说后面没人 = 号    {
        returnfalse;
    }
    key = new_(0, POS); // 腰槽key
    value = new_(POS) + 1, end_pos + 1 - (POS) + 1)); // 腰槽value    Trim(用铰链连接)
    if (())
    {
        returnfalse;
    }
    Trim(重要性); // 因在这里的key和value都这是每一翻阅使铭记,可以连续的修正,因而你不用下赌注于returntrue;
}



// 读取每一cfg文件并保藏到map中,小块地射中靶子键和值都是字母行典型。。bool ReadConfig(conststring & filename, map<string, string> & m)
{
    (); // 砍掉小块地探察射中靶子有K-V对    ifstream infile(());
    if (!infile)
    {
        cout << "file open failed!" << endl; // 文件翻开不足,循环有毛病通信。returnfalse;
    }
    string line, key, value; // 节省千伏对后续while (getline(infile, 线)
    {
        if (AnalyseLine(line, key, 重要性))
        {
            M [键] = value; // 保藏到小块地探察的办法。        }
    }
    (); // 看完后,结束当日广播此文件。returntrue;
}

void PrintConfig(const map<string, string> & m)
{
    map<string, string>::const_iterator mite;
    for (极小量) = (); mite != (); mite++)
    {
        cout << mite->first << "=" << mite->second << endl;
    }
}

void FindInConfig( map<string, string>  m, string  用铰链连接) // 注重:先前运用的常常字母行典型。,因而它也字母行 key,不焦 key。{
    map<string, string>::iterator it;
    it = (用铰链连接)
    if (IT) == ()) 
    {
        cout << "there is no " << key << endl;
    }
    else
    {
        cout << it->second << endl;
    }
}
  • 在这里经过map了解了cfg文件中kv对的存取,出恭采取军事行动。
  • 注重在这里读取的文件的采取军事行动,已局部GETLIN和那个中间定位应变量。
  • 注重全套服装的逻辑: 翻开文件、完全推进同上线、正文疏忽、构筑小块地、接入千伏对,这样的事物,我们家就可以推进cfg文件中有使对某人有利的决定因素了。 
  • 在终极的FIFN-CONFIG应变量中,我们家将瞥见的KV出口,自然,在运用皱纹中,我们家可以连续的腰槽更加的计算。。

上面是密码射中靶子密码:

#include ""int main()
{
    map<string, string> m;
    ReadConfig("C:\\Users\\Administrator\\Desktop\\readConfig\\readConfig\\", m);
    PrintConfig(m);
    string key;
    cout << "Please input a key to find the value in " << endl;
    cin >> key;
    FindInConfig(m, 用铰链连接)
    return0;
}
  • 在这里运用相对地位。。
  • 只引见文件,这相当于嵌入文件。  

我们家成功了手术。,您可以推进以下运转树或花草结果:

如上所示。

经过小进行控告的顶部,我们家就可以成功对cfg文件的读取任务了。