Linux C++实现配置文件读写

ReadConfig.h

#ifndef READCONFIG_H_
#define READCONFIG_H_

class CReadConfig {
public:
	CReadConfig();
	virtual ~CReadConfig();

public:
	int ReadConf(char *file, char *AppName, char *KeyName, char *KeyVal);
	int WriteConf(char*file,char* AppName,char* KeyName,char* KeyVal);
private:
	int getPos(char *buf);
	char *trimSp(char *buf);


};

ReadConfig.cpp

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "readConfig.h"
#define bufSize 1024
#define MaxKeyLength 32

//enum bool
//{
//    false,
//    true
//};

CReadConfig::CReadConfig()
{

}
CReadConfig::~CReadConfig()
{

}

/* *
 * @param buf
 * @desc 删除buf中的制表符以及注释
 * */
char *CReadConfig::trimSp(char *buf)
{
    char tbuf[bufSize] = {'\0'};
    if (buf == NULL || strlen(buf) == 0)
    {
        return NULL;
    }
    int len = strlen(buf);
    int i = 0, j = 0;
    while (i < len)
    {
        //此处注释使用 //
        //若注释使用 # 则使用以下代码代替
        //if (buf[i] == '#')
        //    break;
        if (buf[i] == '/' && buf[i + 1] == '/')
            break;

        if (iscntrl(buf[i]) == 0 && isspace(buf[i]) == 0)
        {
            tbuf[j] = buf[i];
            j++;
        }

        i++;
    }

    //将结果复制到buf
    memset(buf, '\0', len);
    strncpy(buf, tbuf, strlen(tbuf));
    return buf;
}

/***
 * @param buf
 * @desc 获取 = 在字符串中的位置
*/
int CReadConfig::getPos(char *buf)
{
    if (buf == NULL || strlen(buf) == 0)
    {
        return -1;
    }
    int len = strlen(buf);
    int i = 0;
    while (i < len)
    {
        if (buf[i] == '=')
        {
            break;
        }
        i++;
    }
    return i++;
}

/* *
 * @param file
 * @param AppName
 * @param KeyName
 * @param KeyVal
 * @desc  从文件‘file’中的[AppName]中读取属性KeyName的值KeyVal
 * */
int CReadConfig::ReadConf(char *file, char *AppName, char *KeyName, char *KeyVal)
{
    char buf[bufSize] = {'\0'};
    int find_app_name = false;

    if (file == NULL || strlen(file) == 0) //文件名(路径)检查
    {
        return -1;
    }
    FILE *fp = fopen(file, "r"); //打开文件

    if (fp == NULL) //文件句柄检查
    {
        return -1;
    }

    while (fgets(buf, bufSize, fp) != NULL)
    {
        char *tbuf = trimSp(buf);
        int pos = getPos(tbuf);
        int len = strlen(tbuf);

        //printf("string:%s\n", tbuf);

        //查找到 [NAME]
        if (len > 0 && len == pos && tbuf[0] == '[' && tbuf[len - 1] == ']')
        {
            //存放NAME
            char *t_appname = (char *)malloc(len - 1);
            memset(t_appname, '\0', len - 1);
            strncpy(t_appname, tbuf + 1, len - 2);

            //查找到AppName
            if (strncmp(t_appname, AppName, strlen(t_appname)) == 0)
                find_app_name = true;
            else
                find_app_name = false;

            //注意释放空间,防止内存泄露
            free(t_appname);
        }
        else
        {
            //属性名 与 属性值
            if (len > 0 && pos != len && find_app_name)
            {
                char *val = tbuf + pos + 1;//属性值
                tbuf[pos] = '\0';//将=替换为\0  用以分割属性名 与 属性值
                char *key = tbuf;//属性名

                //查找到属性名
                if (strncmp(key, KeyName, strlen(key)) == 0)
                {
                    //将值复制到 KeyVal
                    strncpy(KeyVal, val, strlen(val));
                    break;
                }
            }
        }
    }
    //关闭文件句柄
    if (fp != NULL)
    {
        fclose(fp);
    }

    return 1;
}

/* *
 * @param file
 * @param AppName
 * @param KeyName
 * @param KeyVal
 * @desc  将文件‘file’中的[AppName]中对应属性KeyName的值改为KeyVal
 * */
int CReadConfig::WriteConf(char*file,char* AppName,char* KeyName,char* KeyVal)
{
    char buf[bufSize] = {'\0'};
    int find_app_name = false;

    if (file == NULL || strlen(file) == 0) //文件名(路径)检查
    {
        return -1;
    }
    FILE *fp = fopen(file, "r+"); //打开文件

    if (fp == NULL) //文件句柄检查
    {
        return -1;
    }

    while (fgets(buf, bufSize, fp) != NULL)
    {
        char *tbuf = trimSp(buf);
        int pos = getPos(tbuf);
        int len = strlen(tbuf);

        //printf("string:%s\n", tbuf);

        //查找到 [NAME]
        if (len > 0 && len == pos && tbuf[0] == '[' && tbuf[len - 1] == ']')
        {
            //存放NAME
            char *t_appname = (char *)malloc(len - 1);
            memset(t_appname, '\0', len - 1);
            strncpy(t_appname, tbuf + 1, len - 2);

            //查找到AppName
            if (strncmp(t_appname, AppName, strlen(t_appname)) == 0)
                find_app_name = true;
            else
                find_app_name = false;

            //注意释放空间,防止内存泄露
            free(t_appname);
        }
        else
        {
            //属性名 与 属性值
            if (len > 0 && pos != len && find_app_name)
            {
                char *val = tbuf + pos + 1;//属性值
                tbuf[pos] = '\0';//将=替换为\0  用以分割属性名 与 属性值
                char *key = tbuf;//属性名
                int ll = len - pos ;
                //查找到属性名
                if (strncmp(key, KeyName, strlen(key)) == 0)
                {
                    //将KeyVal复制到 属性值位置
                    int cc = strlen(KeyVal);
                    fseek(fp,-ll,SEEK_CUR);
                    fwrite(KeyVal,cc,1,fp);
                    break;
                }
            }
        }
    }
    //关闭文件句柄
    if (fp != NULL)
    {
        fclose(fp);
    }

    return 1;
}

main_test_raw.cpp

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <readConfig.h>

#define bufSize 1024
#define MaxKeyLength 32
CReadConfig* m_rrconfig;

int main_test_raw(int argc,char* argv[])
{
	m_rrconfig = new CReadConfig();
    char* tbuf = new char[256];
    m_rrconfig->ReadConf("test.data","test","port",tbuf);
    printf("%s \n",tbuf);  //result:555
	char buf[256] = "666666";
	m_rrconfig->WriteConf("test.data","test","port",buf);//file:555->666666

    char* mbuf=new char[256];
    m_rrconfig->ReadConf("test.data","test","port",mbuf);
    printf("%s \n",mbuf);  //result:666666

}

配置文件:

格式:

【name】

AppName = data

文件名:test.data

[test]
port = 555

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ini是一种常见的配置文件格式,它通常用于Windows环境下的软件配置。而在Linux环境下,通常使用不同的配置文件格式,如JSON、XML或各种文本文件。我们可以使用C语言编代码来改这些配置文件。 首先,我们需要使用C语言中的文件操作函数来打开和配置文件。可以使用fopen函数来打开文件,并使用fgets函数逐行配置文件内容。接着,我们可以使用字符串处理函数来解析配置文件的内容,比如使用strtok函数来分割字符串,以获取配置文件中的键值对。 然后,我们可以根据需要修改配置文件的内容。可以使用字符串处理函数来修改配置文件的某个键对应的值,并将修改后的内容回到文件中。可以使用fprintf函数来入修改后的内容,或者使用fseek函数来找到需要修改的位置并使用fwrite函数来进行替换。 最后,我们需要关闭文件,并释放相关的资源。可以使用fclose函数来关闭文件。如果有需要,还可以使用其他相关的函数来释放内存或其他资源。 总结起来,通过使用C语言的文件操作函数和字符串处理函数,我们可以改ini格式的配置文件实现配置文件内容的取和修改。这样就能够在Linux环境下使用C语言来操作和管理配置文件。 ### 回答2: 我们可以使用C语言在Linux系统中修改INI配置文件。 首先,我们需要打开INI配置文件,可以使用标准C库中的文件操作函数来实现。例如,使用`fopen`函数打开一个文件,将文件名和打开模式作为参数传递给它。打开模式可以是“r”(只)、“w”(只)或“a”(追加),具体根据需求而定。如果成功打开文件,将返回一个指向`FILE`结构的指针。 接下来,我们可以使用C的字符串处理函数来取和修改配置文件中的内容。我们可以使用`fgets`函数逐行文件内容并存储到一个字符数组中。如果我们要修改某个配置项的值,可以使用字符串处理函数如`strstr`、`strncpy`等来查找和替换。 修改完成后,我们可以使用`fopen`函数再次以“w”模式打开同一个文件,然后使用`fprintf`函数将修改后的内容文件。最后,我们使用`fclose`函数关闭文件,以释放资源。 需要注意的是,INI文件的格式是由一系列节(section)和键值对组成的。每个节用方括号括起来,每个键值对由一个键(key)和一个值(value)组成。因此,在修改INI文件时,我们需要正确处理节的开始和结束,并且在替换键值对时需要保持格式的统一性。 总之,使用C语言可以很方便地取和修改INI配置文件。通过使用标准C库中的文件操作函数和字符串处理函数,结合逻辑处理,我们可以轻松地实现INI文件的改操作。 ### 回答3: 在Linux系统中,我们可以使用C语言来改INI配置文件。INI文件是一种常见的配置文件格式,通常用于存储软件的各种配置参数。下面是用C语言改INI配置文件的一般步骤: 1. 打开INI配置文件:首先,我们需要使用C语言中的文件操作函数,如`fopen()`来打开INI配置文件。可以使用只入或追加的方式来打开文件,具体要看你的需求。 2. 取和修改配置项:通过使用C语言中的字符串处理函数,比如`fgets()`来逐行配置文件。在每一行中,我们可以通过使用字符串处理函数如`strtok()`来解析出配置项和对应的值。我们可以将取到的配置项和值保存在一个数据结构中(比如数组、链表等),以便于修改和配置文件。 3. 修改配置项值:根据你的需求,你可以通过C语言中的字符串处理函数,如`strcpy()`来修改配置项的值。 4. 回INI配置文件:在修改或添加配置项值之后,我们可以使用C语言中的文件操作函数,例如`fprintf()`或`fputs()`将修改后的配置文件回到原来的INI文件。另外,你也可以选择在内存中操作,最后再一次性回到INI文件。 5. 关闭INI配置文件:在所有的修改和回操作完成后,我们需要使用C语言中的文件操作函数,如`fclose()`来关闭INI配置文件。 请注意,以上只是一个基本的框架,实际的代码可能会稍有不同,比如错误处理、注释的处理、空行的处理等。另外,你也可以使用现有的第三方库来简化INI文件操作,如`inih`库等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值