zoukankan      html  css  js  c++  java
  • c配置文件读取写入

    头文件:Cfg.h

    #ifndef CFG_SET_GET_H
    #define CFG_SET_GET_H
    #ifdef __cplusplus
    extern "C" {
    #endif
    
        int setCfg(char * filename, char *key, char *value);
        int getCfg(char * filename, char *key, char *value);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // !CFG_SET_GET_H

    实现文件:Cfg.c

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MaxLineSize 2048
    #define MaxKeySize 64
    
    int setCfg(char * filename, char *key, char *value)
    {
        //返回值 文件总长度
        int rv = 0, length = 0,isSet = 0;
        //文件指针
        FILE * fp = NULL;
        //暂时保存每行值
        char stringBuf[MaxLineSize];
        char *p;
        //缓存文字
        char logBuffer[2048 * 8] = { 0 };
        //缓存当前行的key
        char cachekey[MaxKeySize];
        //临时辅助指针
        char * vbegin = NULL, *vend = NULL, *vtemp = NULL;
        memset(cachekey, 0, MaxKeySize);
    
        if (filename == NULL || key == NULL || value == NULL)
        {
            printf("PARAM IS ERROR...");
            rv = 1;
            goto End;
        }
        fp = fopen(filename, "r+");
        if (fp == NULL)
        {
            printf("FILE OPEN ERROR...");
            rv = 2;
            goto End;
        }
        //移动到最后
        fseek(fp, 0L, SEEK_END);
        //获取总长度
        length = ftell(fp);
        if (length > 2048*8)
        {
            printf("FILE IS TOO BIG TO OPERATE...");
            rv = 3;
            goto End;
        }
        //移动到最开始
        fseek(fp, 0L,SEEK_SET);
        while (!feof(fp))
        {
            //初始化值
            memset(stringBuf, 0, 2048);
            //获取一行
            p = fgets(stringBuf, 2048, fp);
            //没有匹配到字符 则继续
            if (p == NULL)
            {
                break;
            }
            //保存=字符的指针
            vtemp = strchr(stringBuf, '=');
            //没有匹配到=字符 则继续
            if (vtemp == NULL)
            {
                continue;
            }
            //没有匹配到key字符 则继续
            vtemp = p;
            //去除key前的空字符
            while (1)
            {
                //直到不为空
                if (*vtemp == ' ')
                {
                    vtemp++;
                    continue;
                }
                if (*vtemp == '=')
                {
                    printf("KEY IS EMPTY...
    ");
                    rv = 4;
                    goto End;
                }
                vbegin = vtemp;
                break;
            }
            //去除key后的空字符
            while (1)
            {
                if (*vtemp != ' ' && *vtemp != '=')
                {
                    vtemp++;
                    continue;
                }
                vend = vtemp;
                break;
            }
            memcpy(cachekey, vbegin, vend - vbegin);
            *(cachekey + (vend - vbegin)) = '';
            //没有找到KEY的话 直接链接缓存 继续下一行
            if (strcmp(cachekey, key) != 0)
            {
                //连接字符串
                strcat(logBuffer, stringBuf);
                continue;
            }
            //找到配置项之后 重新配置 连接字符串
            sprintf(stringBuf, "%s = %s
    ", key, value);
            strcat(logBuffer, stringBuf);
            isSet = 1;
        }
        if (isSet == 0)
        {
            fprintf(fp, "%s = %s
    ", key, value);
        }
        else
        {
            if (fp != NULL)
            {
                fclose(fp);
                fp = NULL;
            }
            fp = fopen(filename, "w+");
            if (fp == NULL)
            {
                printf("FILE OPEN ERROR 2...
    ");
                rv = 5;
                goto End;
            }
            fputs(logBuffer, fp);
        }
    End:
        if (fp != NULL)
        {
            fclose(fp);
            fp = NULL;
        }
        return rv;
    }
    int getCfg(char * filename, char *key,char *value)
    {
        //返回值
        int rv = 0;
        //每行的指针
        char *p = NULL;
        //暂时保存每行值
        char stringBuf[MaxLineSize];
        //文件指针
        FILE *fp = NULL;
        //缓存当前行的key
        char cachekey[MaxKeySize];
        //临时辅助指针
        char * vbegin = NULL, *vend = NULL, *vtemp = NULL;
        memset(cachekey, 0, MaxKeySize);
        if (filename == NULL || key == NULL || value == NULL)
        {
            printf("PARAM IS ERROR...
    ");
            rv = 1;
            goto End;
        }
        fp = fopen(filename, "r");
        if (fp == NULL)
        {
            printf("FILE OPEN ERROR...
    ");
            rv = 2;
            goto End;
        }
        while (!feof(fp))
        {
            //初始化值
            memset(stringBuf, 0, 2048);
            //获取一行
            p = fgets(stringBuf, 2048, fp);
            //没有匹配到字符 则继续
            if (p == NULL)
            {
                break;
            }
            //*开头的要忽略
            /*if (*p == '#')
            {
                continue;
            }*/
            //保存=字符的指针
            vtemp = strchr(stringBuf, '=');
            //没有匹配到=字符 则继续
            if (vtemp == NULL)
            {
                continue;
            }
            //没有匹配到key字符 则继续
            vtemp = p;
            //去除key前的空字符
            while (1)
            {
                //直到不为空
                if (*vtemp == ' ')
                {
                    vtemp++;
                    continue;
                }
                if (*vtemp == '=')
                {
                    printf("KEY IS EMPTY...
    ");
                    rv = 4;
                    goto End;
                }
                vbegin = vtemp;
                break;
            }
            //去除key后的空字符
            while (1)
            {
                if (*vtemp != ' ' && *vtemp != '=')
                {
                    vtemp++;
                    continue;
                }
                vend = vtemp;
                break;
            }
            memcpy(cachekey, vbegin, vend - vbegin);
            *(cachekey + (vend - vbegin)) = '';
            if (strcmp(cachekey, key) != 0)
            {
                continue;
            }
            //上面代码优化了下面注释的代码
            /*if (strstr(p, key) == NULL)
            {
                continue;
            }*/
            vbegin = NULL;
            vend = NULL;
            vtemp = strchr(stringBuf, '=');
            //向右一个字符
            vtemp++;
            //获取头指针
            while (1)
            {
                //消除空格
                if (*vtemp == ' ')
                {
                    vtemp++;
                    continue;
                }
                //保存值的首指针
                if (*vtemp == '
    ')
                {
                    printf("VALUE IS EMPTY...
    ");
                    rv = 3;
                    goto End;
                }
                //保存头指针
                vbegin = vtemp;
                break;
            }
            //获取尾指针
            while (1)
            {
                if (*vtemp == ' ' || *vtemp == '
    ')
                {
                    break;
                }
                vtemp++;
            }
            vend = vtemp;
            memcpy(value, vbegin, vend - vbegin);
            *(value + (vend - vbegin)) = '';
            break;
        }
        if (*value == '')
        {
            printf("CONFIG UNFINDED...
    ");
            rv = 5;
        }
    End:
        //释放内存空间
        if (fp != NULL)
        {
            fclose(fp);
            fp = NULL;//避免野指针
        }
        return rv;//返回错误值
    }

    测试文件:file.c

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "Cfg.h"
    
    #define CFG_FILE_NAME "C:/config.ini"
    #define MaxLineSize 2048
    #define MaxKeySize 64
    
    void MenuList()
    {
        printf("PRESS 1 TO SETCONFIG.
    ");
        printf("PRESS 2 TO GETCONFIG.
    ");
        printf("PRESS 0 TO EXIT.
    ");
        printf("SELECT A CONFIG MODE:");
    }
    
    void setCongfigTest()
    {
        int rv = 0;
        char key[MaxKeySize];
        char value[MaxLineSize];
        memset(key, 0, MaxKeySize);
        memset(value, 0, MaxLineSize);
        printf("ENTER A KEY:");
        scanf("%s", key);
        printf("ENTER A  VALUE:");
        scanf("%s", value);
        rv = setCfg(CFG_FILE_NAME, key, value);
        if (rv == 0)
        {
            printf("SETCONFIG SUCCESS...
    ");
        }
        printf("------------------------------------
    ");
    }
    
    void getCongfigTest()
    {
        int rv = 0;
        char key[MaxLineSize];
        char value[MaxLineSize];
        memset(key, 0, MaxLineSize);
        memset(value, 0, MaxLineSize);
        printf("ENTER A KEY TO GET VALUE:");
        scanf("%s", key);
        rv = getCfg(CFG_FILE_NAME, key, value);
        if (rv == 0)
        {
            printf("VALUE OF KEY IS:%s
    ", value);
        }
        printf("------------------------------------
    ");
    }
    
    void main()
    {
        int a = 4;
        while (a != 0)
        {
            MenuList();
            scanf("%d", &a);
            if (a != 0 && a !=1 && a != 2)
            {
                printf("CMD ORDER IS NOT EXIST.
    ");
                printf("------------------------------------
    ");
                continue;
            }
            switch (a)
            {
                case 1:
                    setCongfigTest();
                    break;
                case 2:
                    getCongfigTest();
                    break;
                case 0:
                    printf("LOGOUT SUCCESS.
    ");
                    printf("------------------------------------
    ");
                    break;
            }
            
        }
        system("pause");
    }
  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/godehi/p/8489112.html
Copyright © 2011-2022 走看看