Linux C++ 編程配置文件加載方法

前段時間研究了如何在Linux上讀取配置文件泡态,基于手頭上的項(xiàng)目也成功實(shí)現(xiàn)了,主要通過在C++文件中用定義需從配置文件讀取的配置屬性為全局變量,然后通過讀取函數(shù)來更新配置屬性祝闻。
其中也附有日志等級函數(shù)的打印輸出游昼。
————————————————————————

目錄

  1. 用宏定義配置文件的路徑
  2. 將配置屬性定義為全局變量
  3. 相關(guān)全局變量
  4. 配置文件讀取函數(shù)及其相關(guān)函數(shù)的初始化
  5. 函數(shù)的具體定義
  6. 配置文件作用方法
  7. 配置文件config.ini內(nèi)容
    —————————————————————————

1. 用宏定義配置文件的路徑

//***********[START]相關(guān)宏定義[START]***************
//配置文件路徑
#define CONFIG_FILE_PATH "./config.ini"
//日志等級的宏定義
#define LOG_ERR -1
#define LOG_INF 0
#define LOG_DBG 1
//配置文件關(guān)鍵字長度限制
#define KEYVALLEN 256
//是(1)否(0)使用線程鎖,調(diào)試發(fā)現(xiàn)不使用鎖就不會有延遲
#define USE_PTHREAD_LOCK 0
//*************[END]相關(guān)宏定義[END]*****************

2. 將配置屬性定義為全局變量

//*****[START]從配置文件中獲取的全局變量及其默認(rèn)值[START]******
//------日志配置參數(shù)------
//日志路徑,因?yàn)橐话銓⒔Y(jié)果保存在“result”文件夾中,所以要使用“result/***.log”的格式
char gconf_szLogPath[256] = "result/testResult.log";
//設(shè)置程序日志等級:1 表示打印所有(調(diào)試,一般,錯誤信息),0 表示打印運(yùn)行(一般,錯誤)信息,-1 表示僅打印錯誤信息.
int gconf_nLogLevel = 1;
//設(shè)置程序日志大小上限(單位為bytes,0表示不設(shè)置),超過后日志清空,最大2,147,483,647,建議不要超過104,857,600(即100*1024*1024)
int gconf_lMaxLogSize = 104857600;
//程序開始運(yùn)行時,日志是(1)否(0)清空
int gconf_nLogReset = 1;
//------其余配置參數(shù)------
//設(shè)置程序的運(yùn)行時間,達(dá)到時間后終止程序,方便調(diào)試.(單位為秒,0表示一直運(yùn)行),原為DURATION_TIME
int gconf_nProgramDurationTime = 0;
//*****[END]從配置文件中獲取的全局變量及其默認(rèn)值[END]******

3. 相關(guān)全局變量

//********[START]相關(guān)全局變量[START]****************
//程序首次運(yùn)行標(biāo)記
bool g_bFirstRun = true;
//配置文件加載次數(shù)
int g_nCountLoadConfig = 0;
//用于獲取配置文件屬性
struct stat g_statConfigFile = {0};
//定義車牌及其數(shù)目容器
static vector<string> gs_szVecLicense;
static vector<int> gs_nVecCount;
//時間戳的全局變量
clock_t g_clockLast;
//線程ID
pthread_t g_pthreadRunIPCameraId;
//線程鎖
pthread_mutex_t mutex;
//**********[END]相關(guān)全局變量[END]******************

4. 配置文件讀取函數(shù)及其相關(guān)函數(shù)的初始化

//**********[START]函數(shù)的初始化[START]**************

//-------------結(jié)果目錄創(chuàng)建函數(shù)----------------
//-功能: 處理輸入的結(jié)果路徑,截取相應(yīng)的目錄名,在工作目錄上創(chuàng)建相應(yīng)目錄,用于保存結(jié)果.
int CreateDir(char* szPath,char* szDirPath);

//-------------日志打印函數(shù)--------------------
//-功能: 把日志信息保存到日志文件中,路徑為從配置文件中獲取的全局變量gconf_szLogPath所定義.
void PrintLOG(int nType,const char* ms, ... );

//-------------結(jié)果輸出函數(shù)--------------------
//-功能: 將結(jié)果識別結(jié)果存放到文本文件中,路徑為從配置文件中獲取的全局變量gconf_szPlateResultPath所定義.
void PrintResult(const char* ms, ... );

//---------配置文件讀取輔助函數(shù),刪左空格-------
//-功能: 刪除從配置文件中讀取到的字符串的左空格.
char * l_trim(char * szOutput, const char *szInput);

//---------配置文件讀取輔助函數(shù),刪右空格-------
//-功能: 刪除從配置文件中讀取到的字符串的右空格.
char *r_trim(char *szOutput, const char *szInput);

//---------配置文件讀取輔助函數(shù),刪兩邊空格-------
//-功能: 刪除從配置文件中讀取到的字符串的兩邊空格.
char * a_trim(char * szOutput, const char * szInput);

//---------------配置文件檢查函數(shù)-------------
//-功能: 檢查配置文件是否被修改,如果被修改則返回1,沒變返回0,錯誤返回-1.
static int CheckConfigFileSizeTime();

//---------------配置值讀取函數(shù)----------------
//-功能: 從配置文件中讀取對應(yīng)配置值.
int GetConfigValue(char *szLabelInfoName, char *szKeyName, char *szKeyVal );

//---------------配置值讀取函數(shù)(重載)---------
//-功能: 從配置文件中讀取對應(yīng)配置值,為int型重載.
int GetConfigValue(char *szLabelInfoName, char *szKeyName, int *pnKeyVal );

//---------------配置文件作用函數(shù)--------------
//-功能: 從配置文件中讀取配置,并使之生效.
int LoadConfigFile();

//-------------配置文件重新作用函數(shù)------------
//-功能: 從配置文件中重新讀取配置,并通過線程的重啟來生效.
//       (此函數(shù)功能并未完善,程序也未調(diào)用此函數(shù))
int ReloadConfigFile();

//************[END]函數(shù)的初始化[END]****************

5. 函數(shù)的具體定義


//**********[STAT]函數(shù)具體定義[STAT]**************

//-------------結(jié)果目錄創(chuàng)建函數(shù)----------------
//-功能: 處理輸入的結(jié)果路徑,截取相應(yīng)的目錄名,在工作目錄上創(chuàng)建相應(yīng)目錄,用于保存結(jié)果.
//-Input: 結(jié)果路徑
//-Output: 創(chuàng)建相應(yīng)目錄
//-Return: 如果成功返回1,錯誤返回-1
//--------------------------------------------
int CreateDir(char* szPath,char* szDirPath)
{
    char* pTmpPathStart;
    char* pTmpPathEnd;
    pTmpPathStart = szPath;
    while(pTmpPathEnd = strchr(pTmpPathStart,'/'))
    {
        memset(szDirPath,0,sizeof(szDirPath));
        strncpy(szDirPath,szPath,(size_t)(pTmpPathEnd-szPath));
        pTmpPathStart = pTmpPathEnd + 1;
        //printf("%s\n",szDirPath);
        if(access(szDirPath,0)!=0)
        {
            if(mkdir(szDirPath,S_IRWXU)==-1)
            {
                //PrintLOG(LOG_INF,"創(chuàng)建相應(yīng)目錄出錯:%d!請檢查路徑是否正確.",errno);
                return -1;
            }
        }

    }
    return 1;
}

//-------------日志打印函數(shù)--------------------
//-功能: 把日志信息保存到日志文件中,路徑為從配置文件中獲取的全局變量gconf_szLogPath所定義.
//-Input: 1.日志信息類型
//        2.與printf函數(shù)相似的格式化字符串
//-Output: 打印到日志文件的結(jié)果
//-Return: 無
//--------------------------------------------
void PrintLOG(int nLogType,const char* ms, ... )
{
    char wzLog[1024] = {0};
    char buffer[1024] = {0};
    char szNULL[256] = "";
    va_list args;
    va_start(args, ms);
    vsprintf( wzLog ,ms,args);
    va_end(args);

    struct stat statLogFile = {0};

    time_t now;
    time(&now);
    struct tm *local;
    struct timeval tv;
    local = localtime(&now);
    gettimeofday(&tv, NULL);

    //mkdir("result",S_IRWXU);
    CreateDir(gconf_szLogPath,szNULL);
    FILE* file = fopen(gconf_szLogPath,"a+");
    if(gconf_nLogReset == 1 && g_bFirstRun)
    {
        fclose(file);
        unlink(gconf_szLogPath);
        file = fopen(gconf_szLogPath,"a+");
        g_bFirstRun = false;
    }
    if (stat (gconf_szLogPath, &statLogFile) == -1)
    {
        PrintLOG(LOG_ERR,"獲取日志文件(%s)狀態(tài)失敗:%s.\n", gconf_szLogPath, strerror (errno));
        return;
    }
    if (S_ISDIR(statLogFile.st_mode))
    {
        PrintLOG(LOG_ERR,"此日志文件路徑(%s)是文件夾.錯誤代碼為:%s!", gconf_szLogPath, strerror (errno));
        return;
    }
    if (S_ISREG(statLogFile.st_mode))
    {
        ;//PrintLOG(LOG_INF,"日志文件(%s)大小為:%ld bytes, 最近修改時間為: %s.",gconf_szLogPath, statLogFile.st_size, ctime (&statLogFile.st_mtime));
    }
    if(statLogFile.st_size >= gconf_lMaxLogSize && gconf_lMaxLogSize != 0){
        fclose(file);
        //printf("日志文件已滿,程序終止/n.");
        //exit(1);
        unlink(gconf_szLogPath);
        file = fopen(gconf_szLogPath,"a+");
    }

    if(gconf_nLogLevel == 1){
        if(nLogType == 1){
            sprintf(buffer,"[%04d-%02d-%02d %02d:%02d:%02d.%03ld][DBG] %s\n",local->tm_year+1900, local->tm_mon,local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec,tv.tv_usec/1000,wzLog);
        }
        if(nLogType == 0){
            sprintf(buffer,"[%04d-%02d-%02d %02d:%02d:%02d.%03ld][INF] %s\n",local->tm_year+1900, local->tm_mon,local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec,tv.tv_usec/1000,wzLog);
        }
        if(nLogType == -1){
            sprintf(buffer,"[%04d-%02d-%02d %02d:%02d:%02d.%03ld][ERR] %s\n",local->tm_year+1900, local->tm_mon,local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec,tv.tv_usec/1000,wzLog);
        }
    }
    if(nLogType <= gconf_nLogLevel){
        fwrite(buffer,1,strlen(buffer),file);
        printf("%s",buffer);
        fclose(file);
    }

    //  syslog(LOG_INFO,wzLog);
    return ;
}

//-------------結(jié)果輸出函數(shù)--------------------
//-功能: 將結(jié)果識別結(jié)果存放到文本文件中,路徑為從配置文件中獲取的全局變量gconf_szPlateResultPath所定義.
//-Input: 1.與printf函數(shù)相似的格式化字符串
//-Output: 打印到結(jié)果文件的車牌識別結(jié)果
//-Return: 無
//--------------------------------------------
void PrintResult(const char* ms, ... )
{
    char wzLog[1024] = {0};
    char buffer[1024] = {0};
    char szNULL[256] = "";
    va_list args;
    va_start(args, ms);
    vsprintf( wzLog ,ms,args);
    va_end(args);

    time_t now;
    time(&now);
    struct tm *local;
    struct timeval tv;
    local = localtime(&now);
    gettimeofday(&tv, NULL);
    sprintf(buffer,"[%04d-%02d-%02d %02d:%02d:%02d.%03ld]%s\n",local->tm_year+1900, local->tm_mon,local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec,tv.tv_usec/1000,wzLog);
    printf("%s",buffer);

    //mkdir("result",S_IRWXU);
    CreateDir(gconf_szPlateResultPath,szNULL);

    FILE* file = fopen(gconf_szPlateResultPath,"a+");
    fwrite(buffer,1,strlen(buffer),file);
    fclose(file);

    return ;
}

//---------配置文件讀取輔助函數(shù),刪左空格-------
//-功能: 刪除從配置文件中讀取到的字符串的左空格.
//-Input: 1.被處理后的字符串指針
//        2.待處理的字符串指正
//-Output: 處理完的字符串
//-Return: 字符拷貝函數(shù)的返回結(jié)果
//--------------------------------------------
char * l_trim(char * szOutput, const char *szInput)
{
    assert(szInput != NULL);
    assert(szOutput != NULL);
    assert(szOutput != szInput);
    for   (NULL; *szInput != '\0' && isspace(*szInput); ++szInput){
        ;
    }
    return strcpy(szOutput, szInput);
}

//---------配置文件讀取輔助函數(shù),刪右空格-------
//-功能: 刪除從配置文件中讀取到的字符串的右空格.
//-Input: 1.被處理后的字符串指針
//        2.待處理的字符串指正
//-Output: 處理完的字符串
//-Return: 字符拷貝函數(shù)的返回結(jié)果
//--------------------------------------------
char *r_trim(char *szOutput, const char *szInput)
{
    char *p = NULL;
    assert(szInput != NULL);
    assert(szOutput != NULL);
    assert(szOutput != szInput);
    strcpy(szOutput, szInput);
    for(p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p){
        ;
    }
    *(++p) = '\0';
    return szOutput;
}

//---------配置文件讀取輔助函數(shù),刪兩邊空格-------
//-功能: 刪除從配置文件中讀取到的字符串的兩邊空格.
//-Input: 1.被處理后的字符串指針
//        2.待處理的字符串指正
//-Output: 處理完的字符串
//-Return: 字符拷貝函數(shù)的返回結(jié)果
//--------------------------------------------
char * a_trim(char * szOutput, const char * szInput)
{
    char *p = NULL;
    assert(szInput != NULL);
    assert(szOutput != NULL);
    l_trim(szOutput, szInput);
    for   (p = szOutput + strlen(szOutput) - 1;p >= szOutput && isspace(*p); --p){
        ;
    }
    *(++p) = '\0';
    return szOutput;
}


//---------------配置文件檢查函數(shù)-------------
//-功能: 檢查配置文件是否被修改,如果被修改則返回1,沒變返回0,錯誤返回-1.
//-Input: 無
//-Output: 無
//-Return: 如果被修改則返回1,沒變返回0,錯誤返回-1
//--------------------------------------------
static int CheckConfigFileSizeTime ()
{
    struct stat statTmpConfigFile = {0};
    if (stat (CONFIG_FILE_PATH, &statTmpConfigFile) == -1)
    {
        PrintLOG(LOG_ERR,"獲取配置文件(%s)狀態(tài)失敗:%s.\n", CONFIG_FILE_PATH, strerror (errno));
        return (-1);
    }
    if (S_ISDIR(statTmpConfigFile.st_mode))
    {
        PrintLOG(LOG_ERR,"此配置文件路徑(%s)是文件夾. 錯誤代碼為:%s!", CONFIG_FILE_PATH, strerror (errno));
        return (-1);
    }
    if (S_ISREG (statTmpConfigFile.st_mode))
    {
        ;//PrintLOG(LOG_INF,"配置文件(%s)大小為:%ld bytes, 最近修改時間為:%s",CONFIG_FILE_PATH, statTmpConfigFile.st_size, ctime (&statTmpConfigFile.st_mtime));
    }
    //如果配置文件未被修改,則返回0
    if(statTmpConfigFile.st_size == g_statConfigFile.st_size && statTmpConfigFile.st_mtime == g_statConfigFile.st_mtime){
        return 0;
    }
    //如果配置文件被且是首次運(yùn)行程序修改,則打印相應(yīng)提示,且調(diào)用配置文件讀取函數(shù)讀取相應(yīng)配置值
    else if(g_bFirstRun){
        PrintLOG(LOG_INF,"加載配置文件.");
        g_statConfigFile = statTmpConfigFile;
        return 1;
    }
    //如果配置文件被且不是首次運(yùn)行程序修改,則打印提示,且調(diào)用配置文件讀取函數(shù)讀取相應(yīng)配置值
    else{
        PrintLOG(LOG_INF,"重新加載被修改的配置文件.");
        g_statConfigFile = statTmpConfigFile;
        return 1;
    }
}

//---------------配置值讀取函數(shù)----------------
//-功能: 從配置文件中讀取對應(yīng)配置值.
//-Input: 1.配置文件中待讀取的標(biāo)簽信息名
//        2.配置文件中指定標(biāo)簽中的待讀取關(guān)鍵字名
//        3.配置文件中指定標(biāo)簽和關(guān)鍵字的對應(yīng)配置值(char型指針)
//-Output: 相應(yīng)配置值
//-Return: 如果讀取成功返回1,錯誤返回-1
//--------------------------------------------
int GetConfigValue(char *szLabelInfoName, char *szKeyName, char *szKeyVal )
{
    char szTmpLabelInfoName[32],szTmpKeyName[32];
    char *buf,*c;
    char buf_i[KEYVALLEN], buf_o[KEYVALLEN];
    FILE *fp;
    int found=0; /* 1 szLabelInfoName 2 szKeyName */
    if( (fp=fopen( CONFIG_FILE_PATH,"r" ))==NULL ){
        printf( "openfile [%s] error [%s]\n",CONFIG_FILE_PATH,strerror(errno) );
        return(-1);
    }
    fseek( fp, 0, SEEK_SET );
    memset( szTmpLabelInfoName, 0, sizeof(szTmpLabelInfoName) );
    sprintf( szTmpLabelInfoName,"[%s]", szLabelInfoName );

    while( !feof(fp) && fgets( buf_i, KEYVALLEN, fp )!=NULL ){
        l_trim(buf_o, buf_i);
        if( strlen(buf_o) <= 0 )
            continue;
        buf = NULL;
        buf = buf_o;

        if( found == 0 ){
            if( buf[0] != '[' ) {
                continue;
            } else if ( strncmp(buf,szTmpLabelInfoName,strlen(szTmpLabelInfoName))==0 ){
                found = 1;
                continue;
            }

        } else if( found == 1 ){
            if( buf[0] == '#' ){
                continue;
            } else if ( buf[0] == '[' ) {
                break;
            } else {
                if( (c = (char*)strchr(buf, '=')) == NULL )
                    continue;
                memset( szTmpKeyName, 0, sizeof(szTmpKeyName) );

                sscanf( buf, "%[^=|^ |^\t]", szTmpKeyName );
                if( strcmp(szTmpKeyName, szKeyName) == 0 ){
                    sscanf( ++c, "%[^\n]", szKeyVal );
                    char *szTmpKeyVal_o = (char *)malloc(strlen(szKeyVal) + 1);
                    if(szTmpKeyVal_o != NULL){
                        memset(szTmpKeyVal_o, 0, sizeof(szTmpKeyVal_o));
                        a_trim(szTmpKeyVal_o, szKeyVal);
                        if(szTmpKeyVal_o && strlen(szTmpKeyVal_o) > 0)
                            strcpy(szKeyVal, szTmpKeyVal_o);
                        free(szTmpKeyVal_o);
                        szTmpKeyVal_o = NULL;
                    }
                    found = 2;
                    break;
                } else {
                    continue;
                }
            }
        }
    }
    fclose( fp );
    if( found == 2 )
        return(1);
    else
        return(-1);
}

//---------------配置值讀取函數(shù)(重載)---------
//-功能: 從配置文件中讀取對應(yīng)配置值,為int型重載.
//-Input: 1.配置文件中待讀取的標(biāo)簽信息名
//        2.配置文件中指定標(biāo)簽中的待讀取關(guān)鍵字名
//        3.配置文件中指定標(biāo)簽和關(guān)鍵字的對應(yīng)配置值(int型指針)
//-Output: 相應(yīng)配置值
//-Return: 如果讀取成功返回1,錯誤返回-1
//--------------------------------------------
int GetConfigValue(char *szLabelInfoName, char *szKeyName, int *pnKeyVal )
{
    char szTmpLabelInfoName[32],szTmpKeyName[32],szTmpKeyVal[32];
    char *buf,*c;
    char buf_i[KEYVALLEN], buf_o[KEYVALLEN];
    FILE *fp;
    int found=0; /* 1 szLabelInfoName 2 szKeyName */
    if( (fp=fopen( CONFIG_FILE_PATH,"r" ))==NULL ){
        printf( "openfile [%s] error [%s]\n",CONFIG_FILE_PATH,strerror(errno) );
        return(-1);
    }
    fseek( fp, 0, SEEK_SET );
    memset( szTmpLabelInfoName, 0, sizeof(szTmpLabelInfoName) );
    sprintf( szTmpLabelInfoName,"[%s]", szLabelInfoName );

    while( !feof(fp) && fgets( buf_i, KEYVALLEN, fp )!=NULL ){
        l_trim(buf_o, buf_i);
        if( strlen(buf_o) <= 0 )
            continue;
        buf = NULL;
        buf = buf_o;

        if( found == 0 ){
            if( buf[0] != '[' ) {
                continue;
            } else if ( strncmp(buf,szTmpLabelInfoName,strlen(szTmpLabelInfoName))==0 ){
                found = 1;
                continue;
            }

        } else if( found == 1 ){
            if( buf[0] == '#' ){
                continue;
            } else if ( buf[0] == '[' ) {
                break;
            } else {
                if( (c = (char*)strchr(buf, '=')) == NULL )
                    continue;
                memset( szTmpKeyName, 0, sizeof(szTmpKeyName) );

                sscanf( buf, "%[^=|^ |^\t]", szTmpKeyName );
                if( strcmp(szTmpKeyName, szKeyName) == 0 ){
                    sscanf( ++c, "%[^\n]", szTmpKeyVal );
                    char *szTmpKeyVal_o = (char *)malloc(strlen(szTmpKeyVal) + 1);
                    if(szTmpKeyVal_o != NULL){
                        memset(szTmpKeyVal_o, 0, sizeof(szTmpKeyVal_o));
                        a_trim(szTmpKeyVal_o, szTmpKeyVal);
                        if(szTmpKeyVal_o && strlen(szTmpKeyVal_o) > 0)
                            strcpy(szTmpKeyVal, szTmpKeyVal_o);
                        free(szTmpKeyVal_o);
                        szTmpKeyVal_o = NULL;
                    }
                    found = 2;
                    break;
                } else {
                    continue;
                }
            }
        }
    }
    *pnKeyVal = atoi(szTmpKeyVal);
    fclose( fp );
    if( found == 2 )
        return(0);
    else
        return(-1);
}

//---------------配置文件作用函數(shù)--------------
//-功能: 從配置文件中讀取配置,并使之生效.
//-Input: 無
//-Output: 相應(yīng)配置值
//-Return: 如果成功返回1,錯誤返回-1
//--------------------------------------------
int LoadConfigFile()
{
    bool bGetLogPath = false;
    bool bGetLogLevel = false;
    bool bGetMaxLogSize = false;
    bool bGetLogReset = false;

    int ret = 0;
    ret = CheckConfigFileSizeTime();
    if(ret != 1){
        return ret;
    }

    //從配置文件中獲取日志信息中的日志路徑
    if(GetConfigValue((char*)"Log_Info",(char*)"log_path",gconf_szLogPath) == -1){
        PrintLOG(LOG_ERR,"獲取日志路徑失敗!");
    }
    else
    {
        bGetLogPath = true;
        //PrintLOG(LOG_INF,"日志路徑為:%s",gconf_szLogPath);
    }
    //從配置文件中獲取日志信息中的程序日志級別
    if(GetConfigValue((char*)"Log_Info",(char*)"log_levle",&gconf_nLogLevel) == -1){
        PrintLOG(LOG_ERR,"獲取程序日志級別失敗!");
    }
    else
    {
        bGetLogLevel = true;
        //PrintLOG(LOG_INF,"程序日志級別為:%d",gconf_nLogLevel);
    }
    //從配置文件中獲取日志信息中的日志大小上限
    if(GetConfigValue((char*)"Log_Info",(char*)"log_max_size",&gconf_lMaxLogSize) == -1){
        PrintLOG(LOG_ERR,"獲取日志大小上限失敗!");
    }
    else
    {
        bGetMaxLogSize = true;
        //PrintLOG(LOG_INF,"日志大小上限為:%d",gconf_lMaxLogSize);
    }
    //從配置文件中獲取日志信息中的日志是(1)否(0)清空
    if(GetConfigValue((char*)"Log_Info",(char*)"log_reset",&gconf_nLogReset) == -1){
        PrintLOG(LOG_ERR,"獲取日志清空配置信息失敗!");
    }
    else
    {
        bGetLogReset = true;
        //PrintLOG(LOG_INF,"日志清空配置為:%d",gconf_nLogReset);
    }

    if(g_nCountLoadConfig == 0 &&
            bGetCameraIP && bGetUserName && bGetCameraPassword && bGetCameraPtzTurn && bGetCameraPtzSpeed &&
            bGetPtzTurnLevel && bGetAccuracyFrequency && bGetMaxPlateVectorSize && bGetIntervalOfClearPlateVector && bGetPlateResultPath &&
            bGetLogPath && bGetLogLevel && bGetMaxLogSize && bGetLogReset){
        g_nCountLoadConfig ++;
        PrintLOG(LOG_INF,"全部配置信息均從配置文件獲取.");
    }

    return 1;
}
//************[END]函數(shù)具體定義[END]****************

6. 配置文件作用方法

暫時是在主函數(shù)中設(shè)置循環(huán)甘苍,不斷調(diào)用配置文件讀取函數(shù),使其不斷生效后執(zhí)行相關(guān)操作烘豌。

7. 配置文件config.ini內(nèi)容

[Log_Info]
#日志路徑羊赵,因?yàn)橐话銓⒔Y(jié)果保存在“result”文件夾中,所以要使用“result/***.log”的格式
log_path = result/testResult.log
#設(shè)置程序日志等級:1 表示打印所有(調(diào)試,一般,錯誤信息),0 表示打印運(yùn)行(一般,錯誤)信息,-1 表示僅打印錯誤信息.
log_levle = 1
#設(shè)置程序日志大小上限(單位為bytes扇谣,0表示不設(shè)置)昧捷,超過后日志清空,最大2147483647,建議不要超過104857600(100*1024*1024)
log_max_size = 104857600
#程序開始運(yùn)行時罐寨,日志是(1)否(0)清空
log_reset = 1;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末靡挥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸯绿,更是在濱河造成了極大的恐慌跋破,老刑警劉巖簸淀,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毒返,居然都是意外死亡租幕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門拧簸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劲绪,“玉大人,你說我怎么就攤上這事盆赤〖指唬” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵牺六,是天一觀的道長颤枪。 經(jīng)常有香客問我,道長淑际,這世上最難降的妖魔是什么畏纲? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮春缕,結(jié)果婚禮上霍骄,老公的妹妹穿的比我還像新娘。我一直安慰自己淡溯,他們只是感情好读整,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咱娶,像睡著了一般米间。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膘侮,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天屈糊,我揣著相機(jī)與錄音,去河邊找鬼琼了。 笑死逻锐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雕薪。 我是一名探鬼主播昧诱,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼所袁!你這毒婦竟也來了盏档?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤燥爷,失蹤者是張志新(化名)和其女友劉穎蜈亩,沒想到半個月后懦窘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稚配,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年畅涂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片道川。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡午衰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出愤惰,到底是詐尸還是另有隱情,我是刑警寧澤赘理,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布宦言,位于F島的核電站,受9級特大地震影響商模,放射性物質(zhì)發(fā)生泄漏奠旺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一施流、第九天 我趴在偏房一處隱蔽的房頂上張望响疚。 院中可真熱鬧,春花似錦瞪醋、人聲如沸忿晕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽践盼。三九已至,卻和暖如春宾巍,著一層夾襖步出監(jiān)牢的瞬間咕幻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工顶霞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肄程,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓选浑,卻偏偏與公主長得像蓝厌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子古徒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容