C语言读取配置文件的另类写法

前些天写了一篇《标准输出的重定向》,这几天又遇到了读取配置文件的任务,想一改原来的" FILE* fp ……"之类的写法,换用一种新的灵活性更高的方式,即把标准输出重定向到一个管道的写端,再从管道的读端获取内容。

    首先我们有这样一个函数,用来获取system调用的输出:

static int getResultFromSystemCall(const char* pCmd, char* pResult, int size)
{
   int fd[2];
   if(pipe(fd))   {
      printf("pipe error!\n");
      return -1;
   }

   //hide stdout
   int bak_fd = dup(STDOUT_FILENO);
   int new_fd = dup2(fd[1], STDOUT_FILENO);

   //the output of `pCmd` writes into fd[1]
   system(pCmd);
   read(fd[0], pResult, size-1);
   pResult[strlen(pResult)-1] = 0;

   //resume stdout
   dup2(bak_fd, new_fd);

   return 0;
}

这样,我们可以通过下面的形式调用它:

   char cmd[100] = {0};
   getResultFromSystemCall("export aaa=1234 && echo ${aaa#=}", res, sizeof(res)/sizeof(res[0]));

我们可以获得 1234 这个值了。

我们把该函数的第一个参数再弄的复杂一点,如

cat test.conf | grep -m 1 -E "^aaa" | cut -d= -f2 | sed 's/[[:space:]]*//g'

下面解释一下,各牛们请飘过:

#aaa is test key
aaa =     	   1234
aaa =  bbbb

test.conf 内容如上。

第一层管道的grep,-m 1 指定了我们只获取符合条件的第一行, -E 指定使用grep的扩展形式,也可以用 egrep 代替 grep
-E , "^aaa"  指定了以aaa开头行的条件,用来回避#开头的注释行。
第二层管道的cut,用来截取以 = 分割的第2个域。
第三层管道的sed,用来将 1234 前面的各种tab和空格去掉。

 这样的话,我们就有如下输出结果了:

 tools.c 的代码请见 http://www.oschina.net/code/snippet_616273_14056

我们可以把其中的main函数稍稍改装一下,如

int readValueFromConf(const char* filePath, const char* key, char* res, int size)
{
   char cmd[100] = {0};
   sprintf(cmd, "cat %s | grep -m 1 -E \"^%s\" | cut -d= -f2 | sed 's/[[:space:]]*//g'", filePath, key);
   return getResultFromSystemCall(cmd, res, size);
}

这样,我们就完成了C语言读取配置文件的另类写法。

时间: 2024-08-19 03:51:04

C语言读取配置文件的另类写法的相关文章

用C实现添加和读取配置文件函数_C 语言

发现读取配置文件, 还是用得比较多的. 网上搜了下, 有不少的代码范例了.不过一般实现的函数需要传递的参数都有配置文件的路径.个人认为在某些情况下参数传入 流 重用性更大一点.本想基于流的参数将 读取, 添加, 删除, 修改 配置文件的函数全部实现. 但发现删除 , 修改 需要重新打开流, 单纯传入一个流参数不能方便实现.以下是读取, 添加 配置的函数实现."oper_config.h" 复制代码 代码如下: #ifndef OPER_CONFIG_H_#define OPER_CON

PHP读取配置文件类(php,ini,yaml,xml)

<?php class Settings { var $_settings = array (); function get($var) { $var = explode ( '.', $var ); $result = $this->_settings; foreach ( $var as $key ) { if (! isset ( $result [$key] )) { return false; } $result = $result [$key]; } return $result;

C语言读写配置文件的方法_C 语言

本文实例讲述了C语言读写配置文件的方法.分享给大家供大家参考.具体如下: CException.h如下: /************************************************************************/ /* make0000@msn.com */ /************************************************************************/ /***********************

详解JavaScript的另类写法_javascript技巧

JavaScript 是属于网络的脚本语言! JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用. JavaScript 是因特网上最流行的脚本语言. JavaScript 很容易使用!你一定会喜欢它的! JavaScript一种解释型的脚本语言,语法灵活,让不同的人对同一个功能有很多种不同的写法.怎样组织JavaScript代码才能让别人一眼看出你不简单呢?是否很期待别人在看完你的代码之后感叹一句"原来还可以这样写"呢? 匿名

根据不同的操作系统读取配置文件/java读取属性文件代码

package cn.com.css.common.util; /** * @brief OSEnum.java 操作系统的枚举 * @attention * @author 涂作权 * @date 2014年4月3日 * @note begin modify by null */public enum EOSPlatForm { Any("any"), Linux("Linux"), Mac_OS("Mac OS"), Mac_OS_X(&qu

C语言读取每一行文本

因为编译原理要用到,记录一下.   1 #include <stdio.h> 2 3 int main() 4 { 5 char filename[] = "D:\\阶段性学习\\大三上\\1.课程学习\\编译原理\\0903\\实验二\\test.c"; //文件名 6 FILE *fp; 7 char StrLine[1024]; //每行最大读取的字符数 8 if((fp = fopen(filename,"r")) == NULL) //判断文件

java读取配置文件properties的方法

   示例: 属性文件:beans.properties articleDao=cn.com.leadfar.cms.backend.dao.impl.ArticleDaoImpl channelDao=cn.com.leadfar.cms.backend.dao.impl.ChannelDaoImpl 使用此属性时类的配置如下: PropertiesBeanFactory.java package cn.com.leadfar.cms.utils; import java.io.IOExcep

Java读取配置文件的方法

 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小总结一下,主要叙述的是spring读取配置文件的方法.     一.读取xml配置文件     (一)新建一个java bean package chb.demo.vo; public class HelloBean {  private String helloWorld;  public String getHelloWorld() {   return hello

js读取配置文件的方法

 这篇文章主要介绍了js读取配置文件的方法,需要的朋友可以参考下 自己写的用js读取配置文件的程序  D:Useful StuffJavascriptmytest.txt  文件内容如下     代码如下: [plugin_page_search]  wholeword=0  matchcase=1  hightlight=1  total=1    [data]  up=85  down=5    代码如下: var fso = new ActiveXObject("Scripting.Fil