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");
}
原文地址:https://www.cnblogs.com/godehi/p/8489112.html