⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ini.c

📁 ini配置文件解析
💻 C
字号:

#include <stdio.h>   #include <stdlib.h>
#include <string.h>

/*功能:从配置文件读取一行数据

*输入参数: fp,配置文件FILE指针			
						*输出参数: pcLine,配置文件的一行数据
				 
*返回结果:succ:成功
				  fail: 失败
				  eof:已到文件结尾
*/ 
int  cfg_get_line(FILE *fp, char *pcLine) 
{ 	
	//return NULL on error or when end of file occurs while no characters have been read
	if(fgets(pcLine, MAX_LINE_BUF, fp) == NULL) 
	{ 
		if(feof(fp) == 0 || feof(fp) == -1) 
		{ //未到文件末尾或者出错
			return fail;                         /* error */ 
		} 
		else 
		{
			return eof;                         /* eof */ 
		}
	}
	else
	{
		return succ;
	}
}

/*功能:从配置文件的一行数据中提取section 名

*输入参数: pcLineBuf,配置行字符串				
						*输出参数: pcSection,section名
				 
*返回结果:succ:成功
				  fail: 失败
*/ 
int  cfg_get_section(char *pcLineBuf, char *pcSection) 
{ 
	char *pcPos;
	char *pcStart;
	char *pcEnd;
	int i;

	pcStart = strchr(pcLineBuf, '[');
	if(NULL == pcStart)
	{
		return fail;
	}

	pcEnd = strchr(pcLineBuf, ']');
	if(NULL == pcEnd)
	{
		return fail;
	}

	//去掉section前面和后面的空格
	i = 0;
	for(pcPos=pcStart+1; pcPos<pcEnd; pcPos++)
	{
		if(' ' != *pcPos && '\t' != *pcPos)
		{
			pcSection[i] = *pcPos;
			i++;
		}
	}

	if(0 == i)
	{
		return fail;
	}
	else
	{
		pcSection[i] = '\0';
	}

	INFO("section name: %s \n", pcSection);
	return succ;
} 

/*功能:获取下一个section的名字

*输入参数: fp,配置文件FILE指针				
						*输出参数: pcSection,section名
				 
*返回结果:succ:成功
				  fail: 失败
				  eof:已到文件结尾,未找到下一个section
*/ 
int  cfg_get_next_section(FILE *fp, char *pcSection) 
{
	char caLineBuf[MAX_LINE_BUF]; //行缓存
	char caSectionBuf[MAX_SECTION_BUF]; //section 缓存
	int nRet;
	
	while(!feof(fp))
	{
		//读取配置文件的一行数据
		memset(caLineBuf, 0x00, MAX_LINE_BUF); 
		nRet = cfg_get_line(fp, caLineBuf);
		if(fail == nRet || eof == nRet)
		{
			return nRet;
		}
		else
		{//成功读到一行数据
			INFO("line:%s \n", caLineBuf);

			//该行是否包含section 名
			if(succ == cfg_get_section(caLineBuf, caSectionBuf))
			{
				return succ;
			}			
		}
		
	}

	return eof;
}


/*功能:从配置文件的一行中提取字符串表示的配置项和配置值
   Split key=val pair: 
   xxx    =   yyyyyyyy 
   |      |   | 
   k1     k2  i 

*输入参数: pcLineBuf,配置行字符串
											*输出参数: key,配置项
				  val,配置值
				 *返回结果: succ:成功
				  fail: 失败
*/ 
int  cfg_get_key_val(char *pcLineBuf, char **key, char **val) 
{ 
  int  i, k1, k2, n; 
  int j;

  if((n = strlen((char *)pcLineBuf)) < 1) return fail; 

  //去掉k1前面的空格
  for(i = 0; i < n; i++) 
    if(pcLineBuf[i] != ' ' && pcLineBuf[i] != '\t') break; 

  //该行为空格行
  if(i >= n) return fail; 

  //无xxx key值
  if(pcLineBuf[i] == '=') return fail; 

  //key的起始地址
  k1 = i; 

  //查找'='的起始地址
  for(i++; i < n; i++) 
    if(pcLineBuf[i] == '=') break; 
  if(i >= n) 
  {
  	return fail; 
  }
  else
  {
  	pcLineBuf[i] = '\0';
  }
  
  k2 = i; 

  //查找value,即yyyyyy的起始地址
  for(i++; i < n; i++) 
    if(pcLineBuf[i] != ' ' && pcLineBuf[i] != '\t') break; 

  //去掉k2前面的空格
  for(j=k1; j<k2; j++)
  {
    if(pcLineBuf[j] != ' ' && pcLineBuf[j] != '\t')
    {
    	continue;
    }
	else
	{
  		pcLineBuf[j] = '\0';
		break;
	}
  }

  //去掉yyyy后面的空格、换行符(linux:'\n',  window: "\r\n")
  for(j=i; j<n; j++)
  {
    if(pcLineBuf[j] != ' ' && pcLineBuf[j] != '\t'&& pcLineBuf[j] != '\r'&& pcLineBuf[j] != '\n')
    {
    	continue;
    }
	else
	{
  		pcLineBuf[j] = '\0';
		break;
	}
  }
  *key = pcLineBuf + k1; 
  *val = pcLineBuf + i; 

#if AUTOP_VALUE_EMPTY
  if(strlen(*val) == 0)
  {
		return fail;
  }
#endif

  INFO("key: %2d, %-20s  value: %2d, %-20s \n", strlen(*key), *key, strlen(*val), *val);
  return succ; 
} 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -