zoukankan      html  css  js  c++  java
  • C语言实现 读取写入ini文件实现(转)

    #include <stdio.h>  
    #include <string.h>  
      
    /* 
     * 函数名:         GetIniKeyString 
     * 入口参数:        title 
     *                      配置文件中一组数据的标识 
     *                  key 
     *                      这组数据中要读出的值的标识 
     *                  filename 
     *                      要读取的文件路径 
     * 返回值:         找到需要查的值则返回正确结果 
     *                  否则返回NULL 
     */  
    char *GetIniKeyString(char *title,char *key,char *filename)  
    {  
        FILE *fp;  
        int  flag = 0;  
        char sTitle[32], *wTmp;  
        static char sLine[1024];  
      
        sprintf(sTitle, "[%s]", title);  
        if(NULL == (fp = fopen(filename, "r"))) {  
            perror("fopen");  
            return NULL;  
        }  
      
        while (NULL != fgets(sLine, 1024, fp)) {  
            // 这是注释行  
            if (0 == strncmp("//", sLine, 2)) continue;  
            if ('#' == sLine[0])              continue;  
      
            wTmp = strchr(sLine, '=');  
            if ((NULL != wTmp) && (1 == flag)) {  
                if (0 == strncmp(key, sLine, wTmp-sLine)) { // 长度依文件读取的为准  
                    sLine[strlen(sLine) - 1] = '';  
                    fclose(fp);  
                    return wTmp + 1;  
                }  
            } else {  
                if (0 == strncmp(sTitle, sLine, strlen(sLine) - 1)) { // 长度依文件读取的为准  
                    flag = 1; // 找到标题位置  
                }  
            }  
        }  
        fclose(fp);  
        return NULL;  
    }  
      
    /* 
     * 函数名:         GetIniKeyInt 
     * 入口参数:        title 
     *                      配置文件中一组数据的标识 
     *                  key 
     *                      这组数据中要读出的值的标识 
     *                  filename 
     *                      要读取的文件路径 
     * 返回值:         找到需要查的值则返回正确结果 
     *                  否则返回NULL 
     */  
    int GetIniKeyInt(char *title,char *key,char *filename)  
    {  
        return atoi(GetIniKeyString(title, key, filename));  
    }  
      
    /* 
     * 函数名:         PutIniKeyString 
     * 入口参数:        title 
     *                      配置文件中一组数据的标识 
     *                  key 
     *                      这组数据中要读出的值的标识 
     *                  val 
     *                      更改后的值 
     *                  filename 
     *                      要读取的文件路径 
     * 返回值:         成功返回  0 
     *                  否则返回 -1 
     */  
    int PutIniKeyString(char *title,char *key,char *val,char *filename)  
    {  
        FILE *fpr, *fpw;  
        int  flag = 0;  
        char sLine[1024], sTitle[32], *wTmp;  
      
        sprintf(sTitle, "[%s]", title);  
        if (NULL == (fpr = fopen(filename, "r")))  
            PRN_ERRMSG_RETURN("fopen");// 读取原文件  
        sprintf(sLine, "%s.tmp", filename);  
        if (NULL == (fpw = fopen(sLine,    "w")))  
            PRN_ERRMSG_RETURN("fopen");// 写入临时文件  
      
        while (NULL != fgets(sLine, 1024, fpr)) {  
            if (2 != flag) { // 如果找到要修改的那一行,则不会执行内部的操作  
                wTmp = strchr(sLine, '=');  
                if ((NULL != wTmp) && (1 == flag)) {  
                    if (0 == strncmp(key, sLine, wTmp-sLine)) { // 长度依文件读取的为准  
                        flag = 2;// 更改值,方便写入文件  
                        sprintf(wTmp + 1, "%s
    ", val);  
                    }  
                } else {  
                    if (0 == strncmp(sTitle, sLine, strlen(sLine) - 1)) { // 长度依文件读取的为准  
                        flag = 1; // 找到标题位置  
                    }  
                }  
            }  
      
            fputs(sLine, fpw); // 写入临时文件  
        }  
        fclose(fpr);  
        fclose(fpw);  
      
        sprintf(sLine, "%s.tmp", filename);  
        return rename(sLine, filename);// 将临时文件更新到原文件  
    }  
      
    /* 
     * 函数名:         PutIniKeyString 
     * 入口参数:        title 
     *                      配置文件中一组数据的标识 
     *                  key 
     *                      这组数据中要读出的值的标识 
     *                  val 
     *                      更改后的值 
     *                  filename 
     *                      要读取的文件路径 
     * 返回值:         成功返回  0 
     *                  否则返回 -1 
     */  
    int PutIniKeyInt(char *title,char *key,int val,char *filename)  
    {  
        char sVal[32];  
        sprintf(sVal, "%d", val);  
        return PutIniKeyString(title, key, sVal, filename);  
    }  
      
      
      
    int main(int argc,char *argv[])  
    {  
        printf("%s
    ", GetIniKeyString("DOG", "name", "config.ini"));  
        printf("%d
    ", GetIniKeyInt("DOG", "age", "config.ini"));  
        PutIniKeyString("CAT", "name", "ccc", "config.ini");  
        PutIniKeyInt("DOG", "age", 56, "config.ini");  
        return 0;  
    }  

    这是我自己创建的一个config.ini文件

    #[CAT]
    [CAT]
    //name=dsfdsf
    age=34
    name=aaa
    name1=ooo
    //[DOG]
    [DOG]
    name=bbb
    name1=xxx
    age=25

    当运行程序后。结果为:

    bbb
    25

    最后config.ini文件变为:

    #[CAT]
    [CAT]
    //name=dsfdsf
    age=34
    name=ccc
    name1=ooo
    //[DOG]
    [DOG]
    name=bbb
    name1=xxx
    age=56
    ==========================================================================================
    http://blog.csdn.net/niha1993825jian/article/details/41086403
  • 相关阅读:
    Lock
    synchronized
    线程可见性与原子性
    线程安全问题
    MySQL索引背后的数据结构和原理
    求一颗二叉树中两个节点的最低公共父节点
    Session not active, could not store state 的解决方法
    https nginx 设置
    第三方支付系统
    facebook页面种简单测试js调用flash开放的js接口的方法
  • 原文地址:https://www.cnblogs.com/wainiwann/p/7815352.html
Copyright © 2011-2022 走看看