Linux下用C讀取INI配置檔案

查志強發表於2014-06-10

【原文:http://www.linuxidc.com/Linux/2011-12/49100.htm

在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便讀取.ini配置檔案內容,但是在Linux平臺上就一籌莫展了。為了解決該問題,打算用C來讀取.ini,即可不受平臺的限制了。 
#define CONF_FILE_PATH  "Config.ini"    
   
#include <string.h>    
   
#ifdef WIN32    
#include <Windows.h>    
#include <stdio.h>    
#else    
   
#define  MAX_PATH 260    
   
#include <unistd.h>    
#include <fcntl.h>    
#include <stdio.h>    
#include <stdlib.h>    
#include <stdarg.h>    
#endif    
   
char g_szConfigPath[MAX_PATH];   
   
//獲取當前程式目錄    
int GetCurrentPath(char buf[],char *pFileName)   
{   
#ifdef WIN32    
    GetModuleFileName(NULL,buf,MAX_PATH);    
#else    
    char pidfile[64];   
    int bytes;   
    int fd;   
   
    sprintf(pidfile, "/proc/%d/cmdline", getpid());   
   
    fd = open(pidfile, O_RDONLY, 0);   
    bytes = read(fd, buf, 256);   
    close(fd);   
    buf[MAX_PATH] = '\0';   
   
#endif    
    char * p = &buf[strlen(buf)];   
    do    
    {   
        *p = '\0';   
        p--;   
#ifdef WIN32    
    } while( '\\' != *p );   
#else    
    } while( '/' != *p );   
#endif    
   
    p++;   
   
    //配置檔案目錄    
    memcpy(p,pFileName,strlen(pFileName));   
    return 0;   
}   
   
//從INI檔案讀取字串型別資料    
char *GetIniKeyString(char *title,char *key,char *filename)    
{    
    FILE *fp;    
    char szLine[1024];   
    static char tmpstr[1024];   
    int rtnval;   
    int i = 0;    
    int flag = 0;    
    char *tmp;   
   
    if((fp = fopen(filename, "r")) == NULL)    
    {    
        printf("have   no   such   file \n");   
        return "";    
    }   
    while(!feof(fp))    
    {    
        rtnval = fgetc(fp);    
        if(rtnval == EOF)    
        {    
            break;    
        }    
        else    
        {    
            szLine[i++] = rtnval;    
        }    
        if(rtnval == '\n')    
        {    
#ifndef WIN32    
            i--;   
#endif      
            szLine[--i] = '\0';   
            i = 0;    
            tmp = strchr(szLine, '=');    
   
            if(( tmp != NULL )&&(flag == 1))    
            {    
                if(strstr(szLine,key)!=NULL)    
                {    
                    //註釋行    
                    if ('#' == szLine[0])   
                    {   
                    }   
                    else if ( '\/' == szLine[0] && '\/' == szLine[1] )   
                    {   
                           
                    }   
                    else   
                    {   
                        //找打key對應變數    
                        strcpy(tmpstr,tmp+1);    
                        fclose(fp);   
                        return tmpstr;    
                    }   
                }    
            }   
            else    
            {    
                strcpy(tmpstr,"[");    
                strcat(tmpstr,title);    
                strcat(tmpstr,"]");   
                if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 )    
                {   
                    //找到title    
                    flag = 1;    
                }   
            }   
        }   
    }   
    fclose(fp);    
    return "";    
}   
   
//從INI檔案讀取整型別資料    
int GetIniKeyInt(char *title,char *key,char *filename)   
{   
    return atoi(GetIniKeyString(title,key,filename));   
}   
   
int main(int argc, char* argv[])   
{   
    char buf[MAX_PATH];   
    memset(buf,0,sizeof(buf));   
    GetCurrentPath(buf,CONF_FILE_PATH);   
    strcpy(g_szConfigPath,buf);   
   
    int iCatAge;   
    char szCatName[32];   
       
    iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath);   
    strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));   
   
    return 0;   
}  
下邊是配置檔案:


[CAT]


age=2


name=Tom

相關文章