Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1737713
  • 博文数量: 358
  • 博客积分: 2180
  • 博客等级: 大尉
  • 技术积分: 1810
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 13:47
文章分类

全部博文(358)

文章存档

2016年(17)

2015年(55)

2014年(9)

2013年(67)

2012年(181)

2011年(29)

分类: C/C++

2012-08-01 17:00:24

使用了下面5种方法来读取配置文件:1)字符串读写操作;2)xml解析配置文件;3)stl的读取配置文件封装类,很繁杂,但在大型配置文件中比较有用;4)shell语言的字符串匹配,这是最简单的;5)14结合,shellc的嵌套使用。

1字符串读写操作

测试文件[test.init]

#ini for path

[path]

dictfile = /home/tmp/dict.dat

inputfile= /home/tmp/input.txt

outputfile= /home/tmp/output.txt

#ini for exe

[exe]

user= winter       //user name

passwd= 1234567    #pass word

database= mydatabase

 

int main(int argc, char *argv[])
{
    FILE
* file;
    
char input[100];
    unsigned 
short port;
    
//fopen file to read
    
//...
    while(1)
    
{
        
char* s =fgets(input, 100, file);
        
if(s == NULL) break;
        
if( (!strchr(input, '#'|| (!strchr(input, '[') ) continue;
        
if(!strncasecmp(input, "port"4))
        
{
            port 
= atoi(strchr(input, ''));
        }
                                   
        
if() //...

    }

    
return 0;
}

2 xml解析配置文件法

基本思路:使用libxml2的一些tree解析函数,如:xmlReadFile, xmlDocGetRootElement, xmlStrcmp, xmlNodeGetContent。使用了一些属性:name(结点的名称) child(子结点) next(下一个结点)...

具体可参考本人另一篇blog: http://blog.csdn.net/wqf363/archive/2006/11/18/1394600.aspx

3 stl的读取配置文件封装类

基本思路:读取文件,将某个字符串开头的读入map里的key, 在其value值把其它字符串读入;读取时,查询key, 就获取到与key对应的value了。

4 shell的读取配置文件

# user.conf: configure file for user
# username age *** country
tom 20 male us
chen 22 female cn

 

例如,我们要获取 tom 的性别
可以用脚本这样来实现:
cat user.conf | awk '/^tom[[:blank:]]+/ {print $3}'

5 shellC的嵌套使用
#include <stdio.h>
#include 
<sys/types.h>
#include 
<unistd.h>

static int my_system(const char* pCmd, char* pResult, int size);
int main(void)
{
    
char result[1025];
    my_system(
"cat user.conf | awk '/^tom[[:blank:]]+/ {print $3}'", result, 1025);
    printf(
"the result is: %s ", result);
    
return 0;
}
 

static int my_system(const char* pCmd, char* pResult, int size)
{
    
int fd[2];
    
int pid;
    
int count;
    
int left;
    
char* p = 0;
    
int maxlen = size-1;
    memset(pResult, 
0, size);
    
if(pipe(fd))
    
{
        
return -1;
    }

    
if((pid = fork()) == 0)
    
{// chile process
        int fd2[2];
        
if(pipe(fd2))
        
{
            
return -1;
        }

        close(
1);
        dup2(fd2[
1],1);
        close(fd[
0]);
        close(fd2[
1]);
        system(pCmd);
        read(fd2[
0], pResult, maxlen);
        pResult[strlen(pResult)
-1= 0;
        write(fd[
1], pResult, strlen(pResult));
        close(fd2[
0]);
        exit(
0);
    }

    
// parent process
    close(fd[1]);
    p 
= pResult;
    left 
= maxlen;
    
while((count = read(fd[0], p, left))) {
        p 
+= count;
        left 
-= count;
        
if(left == 0)
        
break;
    }

    close(fd[
0]);
    
return 0;
}

阅读(1150) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~