h4ck1nH4ck1n  2022-10-10 19:41 字节时代 隐藏边栏 |   抢沙发  509 
文章评分 1 次,平均分 5.0

在 Windows 下可以用GetPrivateProfileStringGetPrivateProfileInt方便读取 .ini 配置文件内容,但是在 Linux 平台上就一筹莫展了。

为了解决该问题,使用 C 语言实现读取 .ini 配置文件,可在 Linux 平台上使用,不受平台限制。

#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

#define CONF_FILE_PATH    "Config.ini"
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);
    char *a = GetIniKeyString("CAT","name",g_szConfigPath);
    printf("%d\r\n",iCatAge);
    printf("%s\r\n",a);
    return 0;
}

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

h4ck1n
H4ck1n 关注:0    粉丝:0
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到

扫一扫二维码分享