项目托管地址(详细代码)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
原文地址:http://blog.csdn.net/liuxucoder/article/details/47142089