码迷,mamicode.com
首页 > 其他好文 > 详细

我们一起写个智能管家(三)读取配置文件

时间:2015-07-30 07:10:47      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:c++   智能家庭   配置文件   

项目托管地址(详细代码)https://code.csdn.net/youqi1shi/guanjia


软件运行过程中都会有一些配置信息,像端口啦,服务器地址啦,输入输出设备啦,都是需要加载和配置的。所以,如何进行操作呢?

之前自己开发的时候,采用的是INI格式的配置文件,用的是Windows的库函数进行操作,操作倒是方便,但是离开Windows环境就不能用了,很是为难。

网络上有很多Json和Xml的解析库,用这两种文件做存储也是很方便的,但是总觉得大材小用~其实从文件中读取文件信息的操作很基本~ 尤其是配置信息不多的情况下,完全可以通过简简单单的几十行代码实现信息的读取和存储。

况且C++的文件流操作又是如此方便……

下面是我的一个实现(结合上一篇的异常码机制):

/*Author:steve-liu
*blog:http://blog.csdn.net/liuxucoder/
*git:https://code.csdn.net/youqi1shi/guanjia
*/

#include "config.h"

map<string, string> Info_Config;

/*配置文件路径*/
static string m_path;

/*指定配置文件地址*/
void Config::SetPath(string path)
{
    m_path = path;
}

/*加载配置*/
GJ_ERROR Config::load()
{
    ifstream fin(m_path.c_str());

    try {
        if (false == fin.is_open()) {
            throw GJ_ERROR_FILE;
        }

        string key = "";
        string value = "";
        while (fin >> key) {
            /*这里读取两次,消除中间那个等号*/
            fin >> value >> value;
            Info_Config[key] = value;
        }

        fin.close();
    }
    catch (int code) {
        if (GJ_ERROR_FILE == code)
        {
            fin.close();
        }
        return code;
    }
    return GJ_ERROR_NULL;
}

/*修改配置*/
GJ_ERROR Config::change(string key, string value)
{
    ofstream fout(m_path.c_str());

    try {
        if (false == fout.is_open()) {
            throw GJ_ERROR_FILE;
        }

        Info_Config[key] = value;

        map<string, string>::iterator pos;
        for (pos = Info_Config.begin(); pos != Info_Config.end(); pos++){
            fout << pos->first << " = " << pos->second << endl;
        }

        fout.close();
    }
    catch (int code) {
        if (GJ_ERROR_FILE == code)
        {
            fout.close();
        }
        return code;
    }
    return GJ_ERROR_NULL;
}

/*获取某项配置*/
string Config::read(string key)
{
    return Info_Config[key];
}

配置文件:

技术分享

测试程序:

#include"head.h"

int main()
{
    Config::SetPath("config/test.cfg");
    if(GJ_ERROR_NULL != Config::load()){
        cout<<"文件加载失败"<<endl;
        system("pause");
        return 0;
    };
    cout<<"文件加载成功"<<endl;

    string key = "Port";
    string value = Config::read(key);
    cout<<value<<endl;

    cout <<"这里重新定义了端口"<< endl;
    Config::change("Port", "8853");

    key = "Port";
    value = Config::read(key);
    cout << value << endl;

    cout << "这里重新从文件加载配置" << endl;
    if (GJ_ERROR_NULL != Config::load()){
        cout << "Fail" << endl;
        system("pause");
        return 0;
    };

    key = "Port";
    value = Config::read(key);
    cout << value << endl;

    system("pause");
    return 0;
}

结果:
技术分享


项目托管地址(详细代码)https://code.csdn.net/youqi1shi/guanjia

版权声明:本文为博主原创文章,转载须注明地址:http://blog.csdn.net/liuxucoder

我们一起写个智能管家(三)读取配置文件

标签:c++   智能家庭   配置文件   

原文地址:http://blog.csdn.net/liuxucoder/article/details/47142089

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!