📄 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 + -