`
dqifa
  • 浏览: 116446 次
社区版块
存档分类
最新评论

C++读写ini的类

阅读更多
        =====文件名:IniFile.h=====
/**
* @file
* @brief initialization file read and write API
* @author Deng Yangjun
* @date 2007-12-9
* @version 0.2
*  (C)2007 Midapex
* This program is free software; you can redistribute it and/or modify it
*  under the terms of the GNU Library General Public License as published
*  by the Free Software Foundation; either version 2 of the License,
*  or (at your option) any later version.
*/
#ifndef INI_FILE_CPP_H_
#define INI_FILE_CPP_H_

#include <string>
using namespace std;

class IniFile
{
public:
    IniFile(const string & fileName);
public:
    virtual ~IniFile(void);

    const string & getFileName() const;

    const string &getSection() const;
    void setSection(const string §ion);

    bool write(const string &key, const string & value) const ;
    bool write(const string &key, int value) const ;

    string readStr(const string &key,const string &default_value) const;
    int readInt(const string &key, int default_value) const;

public:
    static int read_profile_string( const char *section, const char *key,char *value,
        int size, const char *default_value, const char *file);
    static int read_profile_int( const char *section, const char *key,int default_value,
        const char *file);
    static int write_profile_string(const char *section, const char *key,
        const char *value, const char *file);

private:
    static int load_ini_file(const char *file, char *buf,int *file_size);
    static int newline(char c);
    static int end_of_string(char c);
    static int left_barce(char c);
    static int right_brace(char c );
    static int parse_file(const char *section, const char *key, const char *buf,int *sec_s,int *sec_e,
        int *key_s,int *key_e, int *value_s, int *value_e);

private:
    string m_fileName;
    string m_section;
};

#endif

        =====文件名:IniFile.cpp=====
/*
 * @file
 * @brief initialization file read and write API implementation
 * @author Deng Yangjun
 * @date 2007-12-9
 * @version 0.2
 * (C)2007 Midapex
 * This program is free software; you can redistribute it and/or modify it
*  under the terms of the GNU Library General Public License as published
*  by the Free Software Foundation; either version 2 of the License,
*  or (at your option) any later version.
 */
#include "IniFile.h"
#include <fstream>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define MAX_INI_FILE_SIZE 1024*16

IniFile::IniFile(const string & fileName)
{
    m_fileName = fileName;
}

IniFile::~IniFile(void)
{
}

const string & IniFile::getFileName() const
{
    return m_fileName;
}

void IniFile::setSection(const string §ion)
{
    m_section = section;
}

bool IniFile::write(const string &key, const string & value) const
{
    return write_profile_string(m_section.c_str(),key.c_str(),value.c_str(),m_fileName.c_str())==1? true:false;
}

bool IniFile::write(const string &key, int value) const
{
    char tmp[64];
    sprintf(tmp,"%d",value);
    return write(key,tmp);
}

string IniFile::readStr(const string &key,const string &default_value) const
{
    char buf[4096];
    read_profile_string(m_section.c_str(),key.c_str(),buf,sizeof(buf),default_value.c_str(),m_fileName.c_str());
    return buf;
}

int IniFile::readInt(const string &key, int default_value) const
{
    return read_profile_int(m_section.c_str(),key.c_str(),default_value,m_fileName.c_str());
}

const string &IniFile::getSection() const
{
    return m_section;
}

int IniFile::load_ini_file(const char *file, char *buf,int *file_size)
{
    FILE *in = NULL;
    int i=0;
    *file_size =0;

    assert(file !=NULL);
    assert(buf !=NULL);

    in = fopen(file,"r");
    if( NULL == in) {
        return 0;
    }

    buf[i]=fgetc(in);

    //load initialization file
    while( buf[i]!= (char)EOF) {
        i++;
        assert( i < MAX_INI_FILE_SIZE ); //file too big, you can redefine MAX_INI_FILE_SIZE to fit the big file
        buf[i]=fgetc(in);
    }

    buf[i]='\0';
    *file_size = i;

    fclose(in);
    return 1;
}

int IniFile::newline(char c)
{
    return ('\n' == c ||  '\r' == c )? 1 : 0;
}
int IniFile::end_of_string(char c)
{
    return '\0'==c? 1 : 0;
}
int IniFile::left_barce(char c)
{
    return '[' == c? 1 : 0;
}
int IniFile::right_brace(char c )
{
    return ']' == c? 1 : 0;
}
int IniFile::parse_file(const char *section, const char *key, const char *buf,int *sec_s,int *sec_e,
                      int *key_s,int *key_e, int *value_s, int *value_e)
{
    const char *p = buf;
    int i=0;

    assert(buf!=NULL);
    assert(section != NULL && strlen(section));
    assert(key != NULL && strlen(key));

    *sec_e = *sec_s = *key_e = *key_s = *value_s = *value_e = -1;

    while( !end_of_string(p[i]) ) {
        //find the section
        if( ( 0==i ||  newline(p[i-1]) ) && left_barce(p[i]) )
        {
            int section_start=i+1;

            //find the ']'
            do {
                i++;
            } while( !right_brace(p[i]) && !end_of_string(p[i]));

            if( 0 == strncmp(p+section_start,section, i-section_start)) {
                int newline_start=0;

                i++;

                //Skip over space char after ']'
                while(isspace(p[i])) {
                    i++;
                }

                //find the section
                *sec_s = section_start;
                *sec_e = i;

                while( ! (newline(p[i-1]) && left_barce(p[i]))
                    && !end_of_string(p[i]) ) {
                        int j=0;
                        //get a new line
                        newline_start = i;

                        while( !newline(p[i]) &&  !end_of_string(p[i]) ) {
                            i++;
                        }

                        //now i  is equal to end of the line
                        j = newline_start;

                        if(';' != p[j]) //skip over comment
                        {
                            while(j < i && p[j]!='=') {
                                j++;
                                if('=' == p[j]) {
                                    if(strncmp(key,p+newline_start,j-newline_start)==0)
                                    {
                                        //find the key ok
                                        *key_s = newline_start;
                                        *key_e = j-1;

                                        *value_s = j+1;
                                        *value_e = i;

                                        return 1;
                                    }
                                }
                            }
                        }

                        i++;
                }
            }
        }
        else
        {
            i++;
        }
    }
    return 0;
}

/*
*@brief read string in initialization file\n
* retrieves a string from the specified section in an initialization file
*@param section [in] name of the section containing the key name
*@param key [in] name of the key pairs to value
*@param value [in] pointer to the buffer that receives the retrieved string
*@param size [in] size of result's buffer
*@param default_value [in] default value of result
*@param file [in] path of the initialization file
*@return 1 : read success; \n 0 : read fail
*/
int IniFile::read_profile_string( const char *section, const char *key,char *value,
                        int size, const char *default_value, const char *file)
{
    char buf[MAX_INI_FILE_SIZE]={0};
    int file_size;
    int sec_s,sec_e,key_s,key_e, value_s, value_e;

    //check parameters
    assert(section != NULL && strlen(section));
    assert(key != NULL && strlen(key));
    assert(value != NULL);
    assert(size > 0);
    assert(file !=NULL &&strlen(key));

    if(!load_ini_file(file,buf,&file_size))
    {
        if(default_value!=NULL)
        {
            strncpy(value,default_value, size);
        }
        return 0;
    }

    if(!parse_file(section,key,buf,&sec_s,&sec_e,&key_s,&key_e,&value_s,&value_e))
    {
        if(default_value!=NULL)
        {
            strncpy(value,default_value, size);
        }
        return 0; //not find the key
    }
    else
    {
        int cpcount = value_e -value_s;

        if( size-1 < cpcount)
        {
            cpcount =  size-1;
        }

        memset(value, 0, size);
        memcpy(value,buf+value_s, cpcount );
        value[cpcount] = '\0';

        return 1;
    }
}

/*
*@brief read int value in initialization file\n
* retrieves int value from the specified section in an initialization file
*@param section [in] name of the section containing the key name
*@param key [in] name of the key pairs to value
*@param default_value [in] default value of result
*@param file [in] path of the initialization file
*@return profile int value,if read fail, return default value
*/
int IniFile::read_profile_int( const char *section, const char *key,int default_value,
                     const char *file)
{
    char value[32] = {0};
    if(!read_profile_string(section,key,value, sizeof(value),NULL,file))
    {
        return default_value;
    }
    else
    {
        return atoi(value);
    }
}

/*
* @brief write a profile string to a ini file
* @param section [in] name of the section,can't be NULL and empty string
* @param key [in] name of the key pairs to value, can't be NULL and empty string
* @param value [in] profile string value
* @param file [in] path of ini file
* @return 1 : success\n 0 : failure
*/
int IniFile::write_profile_string(const char *section, const char *key,
                         const char *value, const char *file)
{
    char buf[MAX_INI_FILE_SIZE]={0};
    char w_buf[MAX_INI_FILE_SIZE]={0};
    int sec_s,sec_e,key_s,key_e, value_s, value_e;
    int value_len = (int)strlen(value);
    int file_size;
    FILE *out;

    //check parameters
    assert(section != NULL && strlen(section));
    assert(key != NULL && strlen(key));
    assert(value != NULL);
    assert(file !=NULL &&strlen(key));

    if(!load_ini_file(file,buf,&file_size))
    {
        sec_s = -1;
    }
    else
    {
        parse_file(section,key,buf,&sec_s,&sec_e,&key_s,&key_e,&value_s,&value_e);
    }

    if( -1 == sec_s)
    {
        if(0==file_size)
        {
            sprintf(w_buf+file_size,"[%s]\n%s=%s\n",section,key,value);
        }
        else
        {
            //not find the section, then add the new section at end of the file
            memcpy(w_buf,buf,file_size);
            sprintf(w_buf+file_size,"\n[%s]\n%s=%s\n",section,key,value);
        }
    }
    else if(-1 == key_s)
    {
        //not find the key, then add the new key=value at end of the section
        memcpy(w_buf,buf,sec_e);
        sprintf(w_buf+sec_e,"%s=%s\n",key,value);
        sprintf(w_buf+sec_e+strlen(key)+strlen(value)+2,buf+sec_e, file_size - sec_e);
    }
    else
    {
        //update value with new value
        memcpy(w_buf,buf,value_s);
        memcpy(w_buf+value_s,value, value_len);
        memcpy(w_buf+value_s+value_len, buf+value_e, file_size - value_e);
    }

    out = fopen(file,"w");
    if(NULL == out)
    {
        return 0;
    }

    if(-1 == fputs(w_buf,out) )
    {
        fclose(out);
        return 0;
    }

    fclose(out);
    return 1;
}

        =====文件名:IniFileCpp.cpp=====
#include "IniFile.h"
#include <iostream>
using namespace std;

int main()
{
    cout << "Midapex IniFile API 0.2.0" << endl;
    string name_key = "name";
    string age_key = "age";

    IniFile ini("myconfig.ini");
    ini.setSection("student");
//    if(!ini.write(name_key,"Tony"))
//    {
//        cout << "write name to ini file fail"<<endl;
//        return -1;
//    }
    if(!ini.write(age_key,20))
    {
        cout << "write age to ini file fail"<<endl;
        return -1;
    }

    cout << "[" << ini.getSection()<< "]" <<endl;
    cout << name_key << "=" << ini.readStr(name_key,"") << endl;
    cout << age_key << "=" << ini.readInt(age_key,-1) << endl;

    ini.setSection("teacher");
    if(!ini.write(name_key,"Tom"))
    {
        cout << "write name to ini file fail"<<endl;
        return -1;
    }
    if(!ini.write(age_key,50))
    {
        cout << "write age to ini file fail"<<endl;
        return -1;
    }

    cout << "[" << ini.getSection()<< "]" <<endl;
    cout << name_key << "=" << ini.readStr(name_key,"") << endl;
    cout << age_key << "=" << ini.readInt(age_key,-1) << endl;

    return 0;
}

分享到:
评论

相关推荐

    C++读写INI类

    这个【标题】"C++读写INI类"所描述的,就是使用C++封装的类,它简化了对INI文件的操作。 在【描述】中提到,这个类是基于Windows API函数封装的,意味着它利用了如`GetPrivateProfileString`、`...

    C++ 读写ini文件

    本文将深入探讨如何使用C++来读写INI文件,以及一个封装好的类`CParseIniFile`的实现。 INI文件通常包含键值对,组织在不同的节(section)中。每节以方括号`[]`括起,键值对则由等号`=`分隔。例如: ``` [Section...

    Linux Windows C++读写ini文件

    C++读写ini文件的基本步骤** - **读取ini文件**:首先需要打开文件,然后逐行读取,解析出节和键值对。 - **写入ini文件**:创建或打开文件后,根据需要写入新的节或键值对,或者修改已有的键值。 **3. 在Windows...

    C++读写ini配置文件

    本文将深入探讨如何使用C++来读写ini配置文件,主要参考提供的"rwconfig.cpp"和"rwconfig.h"源代码。 首先,我们需要了解ini文件的基本结构。它由一系列节(Section)组成,每个节内包含若干键值对(Key-Value ...

    c++ Linux下读写ini文件

    总的来说,`Ini.cpp`和`Ini.h`的组合为在Linux下使用C++读写INI文件提供了便利的抽象层。通过这个类,开发者可以避免直接与文件流交互的复杂性,更专注于业务逻辑。这种设计模式在C++编程中很常见,特别是在处理特定...

    c++封装ini文件的读写类

    一般应用程序都会写配置文件(设置启动的一些参数)...在此提供纯c++下ini类的读写操作类,当然参数转换之后也可以应用到MFC框架之下!对于需要读写ini文件,而又不想花时间去写的话,还不错哦!程序中有用法示例...~~

    c++读写ini文件demo集成

    在这个"**c++读写ini文件demo集成**"中,我们有两个示例程序,将展示如何在C++中实现读取和写入INI文件的功能。 首先,我们需要理解INI文件的基本结构。INI文件由多个节(Section)组成,每个节内包含若干键(Key)...

    C/C++ 读写INI配置文件源代码

    标题提到的"C/C++ 读写INI配置文件源代码"就是一个实现这一功能的源码库,它允许开发者在C或C++项目中轻松地读取和写入INI文件。 INI文件的结构通常由节(Section)、键(Key)和值(Value)组成,如: ```ini ...

    纯C++封装ini配置文件的读写类(file wraper ).

    2. 支持无SECTION的 Key-value 读写. 3. 跨平台. 4. 可配置 "=" 两边需不需要空格等. 详情用法请见Test内容。 eg: CSimpleIniA ini; ini.SetUnicode(); SI_Error rc = ini.LoadFile("example.ini"); if (rc )...

    标准C/C++读写配置文件类,读写ini文件,加入工程就可以用

    标题提到的“标准C/C++读写配置文件类”是指一个专门用于处理INI文件的C++类,它使得开发者能够方便地读取和写入配置文件。这类库通常会封装文件操作的复杂性,提供简洁的API供程序员调用。描述中提到的“非常完美的...

    C++读写INI方法

    ### C++读写INI文件详解 #### 一、概述 在软件开发过程中,经常会遇到需要存储配置信息的需求。为了方便管理这些配置数据,通常会采用INI文件格式来存储。INI文件是一种简单的文本文件,用于存储应用程序配置信息...

    C++实现ini文件读写(Linux和windows平台均可运行)

    C++虽然没有内置的ini文件处理库,但可以通过标准库和自定义逻辑来实现ini文件的读写功能。下面我们将详细探讨如何在Linux和Windows平台上使用C++实现ini文件的读写。 1. **文件操作基础** 在C++中,文件操作主要...

    linux/Win32下读写ini文件的c++类

    **Linux/Win32下读写ini文件的C++类** 在编程中,ini文件是一种常见的配置文件格式,用于存储程序的设置和参数。它的结构简单,易于理解和处理。本篇将详细介绍如何在Linux和Windows环境下,使用C++编写一个类来...

    linux下读写ini文件

    c++写的在linux下读写ini文件。 读 ini.openfile(path, "r"); ini.getstr(...); ini.closefile(); 写 ini.openfile(path, "w"); ini.setstr(...); ini.closefile();

    一个基于stl读写ini的c++类,Base_Ini

    【标题】"一个基于STL读写ini的C++类:Base_Ini" 【描述】在C++编程中,管理配置文件通常是项目中必不可少的一部分。INI文件是一种常见的配置文件格式,用于存储应用的设置和参数。这个“Base_Ini”类库就是专为在...

    本人常用C++类 INI文件读写 IniFile.rar

    总之,这个压缩包中的`IniFile`类提供了一种在C++中方便地读写INI文件的方式,通过封装文件操作和解析逻辑,使得代码更加简洁且易于复用。对于C++开发者来说,理解并能熟练使用这样的类,有助于提高开发效率,特别是...

    纯c读写ini配置文件

    用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符...

    linux下读写INI配置文件库

    1.linux下INI配置文件读写操作库 ======================================================================== if(false) SET(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER "/home/swapp/arm/5.4.0/bin/arm-...

    INI文件读写类

    标题中的“INI文件读写类”指的是在编程中用于处理INI配置文件的特定代码模块,这类模块通常包含一组函数或类,使得程序能够方便地读取、修改和保存INI文件中的数据。INI文件是一种简单的文本格式,常用于存储应用...

    10.如何读写INI文件?(Visual C++编程 源代码)

    10.如何读写INI文件?(Visual C++编程 源代码)10.如何读写INI文件?(Visual C++编程 源代码)10.如何读写INI文件?(Visual C++编程 源代码)10.如何读写INI文件?(Visual C++编程 源代码)10.如何读写INI文件?...

Global site tag (gtag.js) - Google Analytics