C实现配置文件信息读取

 

         在嵌入式应用开发中,我们常需要从某些配置文件中去读取某些所需的信息,此处我们以一个简单的例子为例,来介绍一种基本的配置文件信息提取的方式。

         在文件系统中的有一个文件mac.txt存储着设备的MAC信息,设备在初始化时需要去获取到这个mac信息并进行后续的操作处理。mac.txt的内容如下:

      

         我们编写一个简单的程序去获取文件中的MAC地址内容。

        

源文件

// mac_recognize.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include <string.h>

 

/**ADD***********************************************************************

* Function:    ofp_get_mac_from_file                                     

* Purpose :    read file to get mac address                           

* return  :   TRUE or FLASE                                             

* IN      :   uchar *data_start                                           

* OUT     :   uchar *mac_address                                        

* Author  :   2016-04-14                                         

****************************************************************************/

NBB_VOID ofp_get_mac_from_file(NBB_BYTE*mac_address, NBB_BYTE *data_start)

{

     /* 定义循环所需局部变量*/

     NBB_ULONGvnumber = 0;

     NBB_ULONGloop = 0;

     NBB_ULONGvbit = 0;

     /* 临时数组,用于将字符合并为进制整数*/

     NBB_ULONGtmp[4] = {0};

     /* 将MAC的个部分分开存储*/

     NBB_ULONGmacdata[6] = {0};

     printf("ofp_get_mac_from_file\n");

     if(mac_address == NULL)

     {

         printf("ofpsck2.c mac_address\n");

         goto EXIT_LABEL;

     }

     if(data_start == NULL)

     {   

         printf("ofpsck2.c data_start\n");

         goto EXIT_LABEL;

     }

     /* 逐个字符解析mac 字符串*/

     while(loop < 6)

     {

 

         if((data_start[vbit] == ':')|| (data_start[vbit] == '-') ||

            (data_start[vbit] == '\0' || (data_start[vbit] == '\r'))||

            (data_start[vbit] == '\n'))

         {   

              switch (vnumber)

              {

                   case 1:

                       macdata[loop]= tmp[0];

                       break;

                   case 2:

                       macdata[loop]= tmp[0] * 16 + tmp[1];

                       break;

                   default:

                       break;

              }

              if(macdata[loop] > 255)

              {

                   printf("The mac %d is out of bound!\n",loop);

                   goto EXIT_LABEL;

              }

              /* 将临时数据清空*/

              vnumber= 0;

              memset(tmp,0, sizeof(NBB_ULONG) * 4);

              /* 下一位,下一个ip字节*/

              vbit++;

              loop++;

              continue;

         }

         else

         {

             /* 将单个字符转化为整型*/

              if ((data_start[vbit] >= '0')&& (data_start[vbit] <= '9'))    

              tmp[vnumber]= (NBB_ULONG)(data_start[vbit] - '0');

        elseif ((data_start[vbit] >= 'a') && (data_start[vbit] <= 'f'))    

              tmp[vnumber]= (NBB_ULONG)(data_start[vbit] - 'a' +10);    

        elseif ((data_start[vbit] >= 'A') && (data_start[vbit] <= 'F'))    

              tmp[vnumber]= (NBB_ULONG)(data_start[vbit] - 'A' +10);    

        else    

              tmp[vnumber]= 0;  

              vbit++;

              vnumber++;

         }

     }

     /* 为MAC 地址指针赋值*/

     mac_address[0]= (NBB_BYTE)macdata[0];

     mac_address[1]= (NBB_BYTE)macdata[1];

     mac_address[2]= (NBB_BYTE)macdata[2];

     mac_address[3]= (NBB_BYTE)macdata[3];

     mac_address[4]= (NBB_BYTE)macdata[4];

     mac_address[5]= (NBB_BYTE)macdata[5];

     EXIT_LABEL:

         return;

}

/**MOD***********************************************************************

* Function:    ofp_init_switch_info                                       

* Purpose :    初始化交换机MAC等相关信息                      

* return  :   TRUE or FLASE                                               

* IN      :   void                                                       

* OUT     :   void                                                       

* Author  :   2018-01-18                                        

****************************************************************************/

NBB_VOID ofp_init_switch_info()

{

   OS_FILE *switch_file = NULL; 

     NBB_BYTEtemp_buf[OFP_BUFFER_SIZE] = {0};

     NBB_BYTEtemp_content[OFP_BUFFER_SIZE] = {0};

     NBB_BYTEtemp_value[OFP_BUFFER_SIZE] = {0};

     NBB_BYTEmac_info[6] = {0};

     NBB_BYTEcount = 0;

   printf("ofp_init_switch_info\n");

   /* 只读模式打开版本文件*/

   switch_file = OS_FOPEN(SWITCH_FILE_PATH,"r");

   if(switch_file == NULL)

   {  

       printf("switch_info file is notexsit!\n");

       goto EXIT_LABEL;

   }

   /* 按行读取文件,选择性获取数据*/

   while(NULL != OS_FGETS((char *)temp_buf, OFP_BUFFER_SIZE, switch_file))

   {

        sscanf((char*)temp_buf,"%[^=]=%s\n",temp_content,temp_value);

       if(0 == NBB_MEMCMP(temp_content,"mac",3))

       {         

        ofp_get_mac_from_file(mac_info,temp_value);

              printf("The MAC addr is :");

              for(count = 0;count < 6; count++)

              {

                   printf("%02X ",mac_info[count]);

              }

              printf("\n");

       }

   }

   /* 关闭文件句柄*/

   OS_FCLOSE(switch_file);

   switch_file = NULL;

EXIT_LABEL:

         return;

}

int_tmain(int argc, _TCHAR* argv[])

{

     ofp_init_switch_info();

 

     getchar();

     return 0;

}


 

 

头文件

// stdafx.h : 标准系统包含文件的包含文件,

// 或是经常使用但不常更改的

// 特定于项目的包含文件

//

#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#defineOS_FILE      FILE
#defineOFP_BUFFER_SIZE 64
#defineSWITCH_FILE_PATH  "D:/4-Temp/temp_obj/mac_recognize/mac_recognize/mac.txt"

typedef unsigned char    NBB_BYTE;     /* 8 bits                             */
typedef          char    NBB_CHAR;     /*                                    */
typedef          short   NBB_SHORT;   /* 2 byte signed integer              */
typedef unsigned short   NBB_USHORT;   /* 2 byte unsignedinteger            */
typedef          long    NBB_LONG;     /* 4 byte signedinteger              */
typedef unsigned long    NBB_ULONG;    /* 4 byteunsigned integer            */
typedef          int     NBB_INT;      /* >= 2 bytesigned integer (machine  */
                                       /* word)                              */
typedef unsigned int     NBB_UINT;     /* >= 2 byteunsigned integer         */
                                       /* machine word)                      */
typedef          int     NBB_BOOL;     /* boolean                            */
typedef          void    NBB_VOID;     /* void ifsupported, char otherwise  */

#defineOS_FOPEN(FILE, MODE)               fopen((FILE), (MODE))
#defineOS_REMOVE(FILE)                    remove(FILE)
#defineOS_RENAME(OLDNAME, NEWNAME)        rename((OLDNAME), (NEWNAME))
#defineOS_SETVBUF(STREAM, BUF, TYPE, SIZE)                                  \
                                       setvbuf((STREAM), (BUF), (TYPE), (SIZE))
#defineOS_FCLOSE(FILE)                   fclose(FILE)
#defineOS_FGETS(DEST, LENGTH, FILE)       fgets((DEST), (LENGTH), (FILE))
#defineOS_FFLUSH(FILE)                    fflush(FILE)
#defineOS_FWRITE(DT, B, LEN, FILE)        fwrite(DT, B, LEN, FILE)
#defineOS_FSEEK(FILE, NUM, QUAL)          fseek(FILE, NUM, QUAL)
#defineOS_FTELL(FILE)                     ftell(FILE)
 
#defineNBB_MEMCMP(MEM1, MEM2, LENGTH)                                     \
                                      memcmp((MEM1),(MEM2), (size_t)(LENGTH))

// TODO: 在此处引用程序需要的其他头文件

执行结果:


这样我们就将配置文件中所需的信息提取出来了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值