在嵌入式应用开发中,我们常需要从某些配置文件中去读取某些所需的信息,此处我们以一个简单的例子为例,来介绍一种基本的配置文件信息提取的方式。
在文件系统中的有一个文件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("X ",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: 在此处引用程序需要的其他头文件执行结果:
这样我们就将配置文件中所需的信息提取出来了。