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");
    }
  • 相关阅读:
    CDN网络(二)之配置和优化CDN核心缓存软件--squid
    CDN网络(一)之典型的CND架构与HTTP协议的缓存控制
    http+mysql结合keepalived做热备
    网络存储(四)之ISCSI的进阶
    Nginx系列3之Nginx+tomcat
    Nginx系列2之Nginx+php
    Nginx系列1之部分模块详解
    网络存储(三)之ISCSI搭建的入门
    网络存储(二)之ISCSI原理
    Testing
  • 原文地址:https://www.cnblogs.com/godehi/p/8489112.html
Copyright © 2011-2022 走看看