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;

}





你可能感兴趣的:(windows)