zoukankan      html  css  js  c++  java
  • 20、在Linux中实现类似windows中获取配置文件的函数GetProfileString

    在读取配置文件时,window环境下,有GetProfileString函数,而Linux下则没有。我写了一个能实现其功能的函数,如下所示,基本思想是捉住配置文件中用“[]”标记的段没有“=”,而非“[]”段有“=”这一特征,先找section段,再找键,得到对应的值。不当之处,欢迎批评指正。

    配置文件示例

    [section1]
    age = 12
    name = edward
    [section2]
    age = 13
    name = lewis
    

    代码示例

    #include "cstdio"
    #include "iostream"
    #include "string"
    #include "fstream"
    
    
    using namespace std;
    
    const int OP_SUCCESS = 0;
    const int OP_FAILED = -1;
    
    int GetProfileString(string file_name, string section_name, string item_name, string &item_value)
    {
    	ifstream mystream;
    	mystream.open(file_name.c_str(), ios::in);
    	if (!mystream)
    	{
    		cout << "Error " << endl;
    		return -1;
    	}
    
    	char line[30];
    	string line2;
    	size_t return_of_find;
    	bool found = false;
    	while(mystream.getline(line, 30) && !found) //默认行不会超过30个字符
    	{
    		line2 = line;
    		return_of_find = line2.find(section_name);
    		if (string::npos == return_of_find)
    		{
    			continue; //没找到section项,则继续下一行读取
    		}
    
    		//找到了,则执行第二步,寻找相应的键值,关键是不能跨越多段
    		while(mystream.getline(line, 30) && !found)
    		{
    			line2 = line;
    			string equal_flag = "=";
    			return_of_find = line2.find(equal_flag);
    
    			if (string::npos == return_of_find)
    			{
    				//说明已经跨越了多段,目标寻找失败
    				return -1;
    			}
    
    			//还在当前段中
    			return_of_find = line2.find(item_name);
    			if (string::npos == return_of_find)
    			{
    				//没有找到
    				continue;
    			}
    			//找到了
    			return_of_find = line2.rfind(" "); //要求配置文件=两边要有空格
    			item_value = line2.substr(return_of_find + 1);
    			found = true;
    			if (' ' == item_value[0])
    			{
    				item_value = item_value.substr(1);
    			}
    		}
    	}
    	mystream.close();
    	return 0;
    }
    int main(int argc, char* argv[])
    {
    	string file_name, section_name, item_name, item_value;
    	file_name = "F:\\test.txt";
    	section_name = "section2";
    	item_name = "age";
    	GetProfileString(file_name, section_name, item_name, item_value);
    	cout << item_value << endl;
    	return 0;
    }
    
    
    

  • 相关阅读:
    库函数文件操作
    系统文件操作函数
    time函数
    字符(串)输入输出函数
    select&epoll
    epoll
    select
    Apache 配置虚拟主机三种方式
    Apache VirtualHost配置
    Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed
  • 原文地址:https://www.cnblogs.com/mydomain/p/2122860.html
Copyright © 2011-2022 走看看