修改一个操作ini的类

11 篇文章 0 订阅

最近一个项目需要用到读写ini配置文件,以往都是用BCB内置的

引用 一个通用ini配置文件操作类 

发现其新建一个ini和增加、读取都没有问题,但修改就不正常了。调试发现是其缺少了一句修改语句。

修改后完整源文件如下:

//---------------------------------------------------------------------------
#ifndef IniFileH
#define IniFileH
#include <fstream>
#include <map>
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
//---------------------------------------------------------------------------
class IniFile
{
public:
    explicit IniFile(const string &fileName);
    ~IniFile(void);
    bool ReadFile(void);
    string ReadString( const string section, const string &key, const string &value );
    int    ReadInt( const string section, const string &key, int value );
    bool WriteString( const string section, const string &key, const string &value );
    bool WriteInt( const string section, const string &key, int value );
    bool RemoveSection( const string section );
    bool RemoveKey( const string section, const string &key );
    bool WriteFile(void);
private:
    static string Trim( const string &str );
    static string LTrim( const string &str );
    static string RTrim( const string &str );
private:
    string m_fileName;
    vector<string> m_vctLine;
    bool m_modifyFlag;
};

#endif
//---------------------------------------------------------------------------
#pragma hdrstop
//windows
#define WIN32   1
#include "IniFile.h"

//---------------------------------------------------------------------------
IniFile::IniFile(const string &fileName)
    : m_fileName(fileName),
      m_modifyFlag(false)
{
    ReadFile();
}

IniFile::~IniFile(void)
{
    WriteFile();
}
/************************************************************************/
/* 字符串的迭代器定义                                                       */
/************************************************************************/
struct ci_char_traits : public char_traits<char>
{
    static bool eq(char c1, char c2)
    {
        return toupper(c1) == toupper(c2);
    }
    static bool ne(char c1, char c2)
    {
        return toupper(c1) != toupper(c2);
    }
    static bool lt(char c1, char c2)
    {
        return toupper(c1) < toupper(c2);
    }
    static bool compare(const char *s1, const char *s2, size_t n)
    {
#ifdef WIN32
        return memicmp(s1, s2, n) != 0; //实现不区分大小写的串比较
#else
        //linux不支持memicmp,自定义版本
        char *tmps1 = new char[n];
        char *tmps2 = new char[n];
        for( size_t i = 0; i < n; ++i )
        {
            tmps1[i] = toupper(s1[i]);
            tmps2[i] = toupper(s2[i]);
        }
        bool b =  memcmp(tmps1, tmps2, n) != 0;
        delete []tmps1;
        delete []tmps2;
        return b;
#endif
    }
    static const char *find(const char *s, int n, char a)
    {
        while (n-- > 0  &&  toupper(*s) != toupper(a) )
            ++s;
        return s;
    }
};
typedef basic_string<char, ci_char_traits> ci_string;  //不区分大小写的string类型


bool IniFile::ReadFile( void )
{
    ifstream in(m_fileName.c_str());
    if( false == in.is_open() )
        return false;

    string line;
    while( getline(in, line) )
    {
        m_vctLine.push_back(line);
    }
    m_modifyFlag = false;
    return true;
}

bool IniFile::WriteFile( void )
{
    //check if is need to save
    if( false == m_modifyFlag )
    {
        return true;
    }
    ofstream out(m_fileName.c_str());
    for( size_t i = 0; i < m_vctLine.size(); ++i )
    {
        out << m_vctLine[i] << endl;
        cout<< m_vctLine[i].c_str() << endl;
    }
    m_modifyFlag = false;
    return true;
}

string IniFile::ReadString( const string section, const string &key, const string &defval )
{
    for( size_t i = 0; i < m_vctLine.size(); ++i )
    {
        string section_line = LTrim(m_vctLine[i]);
        size_t sec_begin_pos = section_line.find('[');
        if( sec_begin_pos == string::npos || sec_begin_pos != 0 )
        {
            continue;
        }
        size_t sec_end_pos = section_line.find( ']', sec_begin_pos );
        if( sec_end_pos == string::npos )
        {
            continue;
        }

        if( ci_string(section.c_str()) != Trim(section_line.substr(sec_begin_pos + 1, sec_end_pos - sec_begin_pos - 1) ).c_str() )
        {
            continue;
        }

        //find key
        for( ++i; i < m_vctLine.size(); ++i )
        {
            string key_line = LTrim(m_vctLine[i]);
            size_t sec_pos = key_line.find('[');
            if( sec_pos != string::npos && sec_pos == 0 )
            {
                --i;  //reback a step,find again
                break;//the line is section line
            }

            if( key_line.find('#') != string::npos )
            {
                continue;//this is comment line
            }
            size_t equal_pos = key_line.find( '=' );
            if( equal_pos == string::npos )
            {
                continue;
            }
            if( ci_string(key.c_str()) != RTrim(key_line.substr( 0, equal_pos ) ).c_str() )
            {
                continue;
            }

            size_t comment_pos = key_line.find( "#", equal_pos + 1 );
            if( comment_pos != string::npos )
            {
                return Trim(key_line.substr( equal_pos + 1, comment_pos - equal_pos - 1 ));
            }

            return Trim(key_line.substr( equal_pos + 1 ));
        }
    }

    return defval;
}
bool IniFile::WriteString( const string section, const string &key, const string &value )
{
    for( size_t i = 0; i < m_vctLine.size(); ++i )
    {
        string section_line = LTrim(m_vctLine[i]);
        size_t sec_begin_pos = section_line.find('[');
        if( sec_begin_pos == string::npos || sec_begin_pos != 0 )
        {
            continue;
        }
        size_t sec_end_pos = section_line.find( ']', sec_begin_pos );
        if( sec_end_pos == string::npos )
        {
            continue;
        }
        if( ci_string(section.c_str()) != RTrim(section_line.substr(sec_begin_pos + 1, sec_end_pos - sec_begin_pos - 1)).c_str() )
        {
            continue;
        }

        //find key
        for( ++i; i < m_vctLine.size(); ++i )
        {
            string key_line = LTrim(m_vctLine[i]);
            size_t sec_pos = key_line.find('[');
            if( sec_pos != string::npos && sec_pos == 0 )
            {
                --i;  //reback a step,find again
                break;//the line is section line
            }

            if( key_line.find('#') != string::npos )
            {
                continue;//this is comment line
            }
            size_t equal_pos = key_line.find( '=' );
            if( equal_pos == string::npos )
            {
                continue;
            }
            if( ci_string(key.c_str()) != RTrim(key_line.substr( 0, equal_pos )).c_str() )
            {
                continue;
            }

            size_t comment_pos = key_line.find( "#", equal_pos + 1 );
            string new_line = key_line.substr( 0, equal_pos + 1 ) + value;
            if( comment_pos != string::npos )
            {
                new_line += key_line.substr( comment_pos );
            }
            key_line = new_line;
            m_vctLine[i]= key + "=" + value; // 2018-11-10 15:19:29 修改
            m_modifyFlag = true;
            return true;
        }

        //add a new key
        m_vctLine.insert( m_vctLine.begin() + i, key + "=" + value );
        m_modifyFlag = true;
        return true;
    }

    //add a new section and a new key
    m_vctLine.insert( m_vctLine.end(), "" );
    m_vctLine.insert( m_vctLine.end(), "[" + section + "]" );
    m_vctLine.insert( m_vctLine.end(), key + "=" + value );
    m_modifyFlag = true;
    return true;
}
bool IniFile::RemoveSection( const string section )
{
    for( size_t i = 0; i < m_vctLine.size(); ++i )
    {
        string section_line = LTrim(m_vctLine[i]);
        size_t sec_begin_pos = section_line.find('[');
        if( sec_begin_pos == string::npos || sec_begin_pos != 0 )
        {
            continue;
        }
        size_t sec_end_pos = section_line.find( ']', sec_begin_pos );
        if( sec_end_pos == string::npos )
        {
            continue;
        }
        if( ci_string(section.c_str()) != RTrim(section_line.substr(sec_begin_pos + 1, sec_end_pos - sec_begin_pos - 1)).c_str() )
        {
            continue;
        }

        //
        size_t del_begin = i;
        for( ++i ; i < m_vctLine.size(); ++i )
        {
            string next_section = LTrim(m_vctLine[i]);
            size_t next_pos = next_section.find('[');
            if( next_pos == string::npos || next_pos != 0 )
            {
                continue;
            }

            break;
        }
        m_vctLine.erase( m_vctLine.begin() + del_begin, m_vctLine.begin() + i );
        return true;
    }
    return false;
}
bool IniFile::RemoveKey( const string section, const string &key )
{
    for( size_t i = 0; i < m_vctLine.size(); ++i )
    {
        string section_line = m_vctLine[i];
        size_t sec_begin_pos = section_line.find('[');
        if( sec_begin_pos == string::npos || sec_begin_pos != 0 )
        {
            continue;
        }
        size_t sec_end_pos = section_line.find( ']', sec_begin_pos );
        if( sec_end_pos == string::npos )
        {
            continue;
        }
        if( ci_string(section.c_str()) != Trim(section_line.substr(sec_begin_pos + 1, sec_end_pos - sec_begin_pos - 1)).c_str() )
        {
            continue;
        }

        //find key
        for( ++i ; i < m_vctLine.size(); ++i )
        {
            string key_line = m_vctLine[i];
            key_line = Trim(key_line);
            if( key_line.find('#') == 0 )
            {
                continue;
            }

            size_t key_pos = key_line.find('=');
            if( key_pos == string::npos )
            {
                continue;
            }

            if( ci_string(key.c_str()) == Trim(key_line.substr(0, key_pos)).c_str() )
            {
                m_vctLine.erase( m_vctLine.begin() + i );
                return true;
            }
        }
    }
    return false;
}
int IniFile::ReadInt( const string section, const string &key, int value )
{
    string str = ReadString( section, key, "" );
    if( "" == str )
    {
        return value;
    }

    istringstream in( str.c_str() );
    int ret = 0;
    in >> ret;
    return ret;
}

bool IniFile::WriteInt( const string section, const string &key, int value )
{
    ostringstream out;
    out << value;
    return WriteString( section, key, out.str() );
}

string IniFile::LTrim(const string &str)
{
    if(str.empty())
        return "";
    else
        return str.substr(str.find_first_not_of(" \n\r\t"));
}

string IniFile::RTrim(const string &str)
{
    if(str.empty())
        return "";
    else
        return str.substr(0, str.find_last_not_of(" \n\r\t") + 1);
}

string IniFile::Trim(const string &str)
{
    return LTrim( RTrim(str));
}

#pragma package(smart_init)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值