本类是在网络上的一个标准ini读写类修改扩展而来,新增了获取当前可执行文件路径,宽字节转多字节功能

IniFileSTL.h:

#ifndef _FISH_INI_FILE_
#define _FISH_INI_FILE_#include <string>
#include <vector>namespace fish
{
using namespace std;class IniFileSTL
{
public:explicit IniFileSTL(const string &fileName);~IniFileSTL(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);//获取当前可执行文件的路径(不包含EXE文件名)static string GetExeDir();//宽字节转多字节(wchar-char)static char* WcharToChar(const wchar_t* wp);//多字节转宽字节(char-wchar)static wchar_t* CharToWchar(const char* cp);
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;
};}#endif//简单使用例子
//#include <stdio.h>
//#include <iostream>
//#include "IniFile.h"
//
//using namespace fish;
//
//int main(int argc, char **argv)
//{
//  IniFile ini("./test.ini");
//  cout<<ini.ReadString("system","ipaddr", "10.70.101.134")<<endl;
//  cout<<ini.ReadInt("system","tcpport", 7050 )<<endl;
//  return 0;
//}

IniFileSTL.cpp:

#include "stdafx.h"
#include "IniFileSTL.h"
#include <fstream>
#include <strstream>
#include <string>
namespace fish
{IniFileSTL::IniFileSTL(const string &fileName)
:m_fileName(fileName)
{ReadFile();
}IniFileSTL::~IniFileSTL(void)
{WriteFile();
}//获取当前可执行文件的路径(不包含EXE文件名)
string IniFileSTL::GetExeDir()
{wchar_t exeFullPath[MAX_PATH]; // Full path  string StrPath=" "; GetModuleFileName(NULL, exeFullPath, MAX_PATH); StrPath=(string)WcharToChar(exeFullPath);    // Get full path of the file   int leng = StrPath.length();int pos = StrPath.find_last_of('\\', StrPath.length());  StrPath=StrPath.substr(0, pos); return StrPath.substr(0, pos);  // Return the directory without the file name
}//宽字节转多字节(wchar-char)
char* IniFileSTL::WcharToChar(const wchar_t* wp)
{locale old_loc = locale::global(locale(""));size_t len = wcslen(wp)*sizeof(wchar_t);size_t converted=0;char*CStr;CStr=(char*)malloc(len);wcstombs_s(&converted,CStr,len,wp,_TRUNCATE);locale::global(old_loc);return CStr;
}//多字节转宽字节(char-wchar)
wchar_t* IniFileSTL::CharToWchar(const char* cp)
{locale old_loc = locale::global(locale(""));size_t len = strlen(cp)*sizeof(char);size_t converted=0;wchar_t *WStr;WStr=(wchar_t*)malloc(2*len);mbstowcs_s(&converted,WStr,len,cp,_TRUNCATE);locale::global(old_loc);return WStr;
}bool IniFileSTL::ReadFile( void )
{ifstream in(m_fileName.c_str());bool bopen = in.is_open();string line;while( getline(in,line) ){m_vctLine.push_back(line);}return true;
}string IniFileSTL::ReadString( const string &section, const string &key, const string &value )
{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( section != Trim(section_line.substr(sec_begin_pos+1, sec_end_pos-sec_begin_pos-1) ) ){continue;}//find key, ÕâÀïµÄϱ껹ÊÇifor( ++i; i < m_vctLine.size(); ++i ){string &key_line = m_vctLine[i];size_t sec_pos = key_line.find('[');if( sec_pos != string::npos && sec_pos == 0 ){--i;  //reback a step,find againbreak;//the line is section line}size_t begin_key_pos = key_line.find(key);if( begin_key_pos == string::npos ){continue;}size_t equal_pos = key_line.find( '=', begin_key_pos );if( equal_pos == string::npos ){continue;}if( key != Trim(key_line.substr( begin_key_pos, equal_pos - begin_key_pos) ) ){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 value;
}bool IniFileSTL::WriteString( const string &section, const string &key, const string &value )
{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( section != Trim(section_line.substr(sec_begin_pos+1, sec_end_pos-sec_begin_pos-1)) ){continue;}//find key, ÕâÀïµÄϱ껹ÊÇifor( ++i; i < m_vctLine.size(); ++i ){string &key_line = m_vctLine[i];size_t sec_pos = key_line.find('[');if( sec_pos != string::npos && sec_pos == 0 ){--i;  //reback a step,find againbreak;//the line is section line}size_t begin_key_pos = key_line.find(key);if( begin_key_pos == string::npos ){continue;}size_t equal_pos = key_line.find( '=', begin_key_pos );if( equal_pos == string::npos ){continue;}if( key != Trim(key_line.substr( begin_key_pos, equal_pos - begin_key_pos )) ){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;return true;}//δÕÒµ½keym_vctLine.insert( m_vctLine.begin() + i, key + "=" + value ); return true;}//sectionºÍkey¶¼²»´æÔÚm_vctLine.insert( m_vctLine.end(), "" );m_vctLine.insert( m_vctLine.end(), "[" + section + "]" );m_vctLine.insert( m_vctLine.end(), key + "=" + value );return true;
}bool IniFileSTL::RemoveSection( const string &section )
{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( section != Trim(section_line.substr(sec_begin_pos+1, sec_end_pos-sec_begin_pos-1)) ){continue;}//ÕÒµ½ÁËsectionsize_t del_begin = i;for( ++i ; i < m_vctLine.size(); ++i ){string &next_section = 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 IniFileSTL::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( section != Trim(section_line.substr(sec_begin_pos+1, sec_end_pos-sec_begin_pos-1)) ){continue;}//ÕÒµ½ÁËsectionfor( ++i ; i < m_vctLine.size(); ++i ){string &key_line = m_vctLine[i];size_t key_pos = key_line.find( key );if( key_pos == string::npos || key_pos != 0 ){continue;}else{m_vctLine.erase( m_vctLine.begin() + i );return true;}}}return false;
}bool IniFileSTL::WriteFile( void )
{ofstream out(m_fileName.c_str());for( size_t i = 0; i < m_vctLine.size(); ++i ){out<<m_vctLine[i]<<endl;}return true;
}int IniFileSTL::ReadInt( const string &section, const string &key, int value )
{string str = ReadString( section, key, "" );if( "" == str ){return value;}istrstream in( str.c_str() );int ret = 0;in>>ret;return ret;
}bool IniFileSTL::WriteInt( const string &section, const string &key, int value )
{ostrstream out;out<<value;//char buffer[64] = "";//itoa( value, buffer, 10 );return WriteString( section, key, out.str() );
}string IniFileSTL::LTrim( const string &str )
{size_t pos = 0;while( pos != str.size() ){if( ' ' == str[pos] ){++pos;}else{break;}}return str.substr(pos);
}string IniFileSTL::RTrim( const string &str )
{size_t pos = str.size() - 1;while( pos >= 0 ){if(' ' == str[pos]){--pos;}else{break;}}return str.substr( 0, pos + 1 );
}string IniFileSTL::Trim(const string &str)
{return LTrim( RTrim(str) );
}}

简单使用案例:

 string str;fish::IniFileSTL ini(fish::IniFileSTL::GetExeDir()+"\\cfglocal.ini");str=ini.ReadString("OccMarkShow","Showflag","0");

参考文件:csdn下载资源

标准c++读写ini文件类相关推荐

  1. 十、封装python3读写ini文件类

    自己编写封装的python3读写ini文件类. main.py # -*- coding: utf-8 -*- import os import configparserclass OperateIn ...

  2. (vc)分享一个读写ini文件的类,支持多种数据类型的读写,二进制数据都能保存和读取...

    读写ini文件的类叫CIni,有ini.h和ini.cpp两个文件组成.     ini.h文件: #pragma once#define SER_GET(bGet,value) SerGet(bGe ...

  3. VC中读写ini文件

    我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下: 一.将信息写入.INI文件中. 1.所用的WINAP ...

  4. C#学习笔记——读写ini文件

    1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: ...

  5. C#关于读写INI文件

    C#关于读写INI文件 什么是ini文件就是一个配置文件,一般把数据库等配置信息放进去,然而,改变数据库的密码,数据库名称,ip等,不要改源码重新编译,只需要用记事本打开set.ini 文件,修改保存 ...

  6. C# 读写Ini文件

    ini文件在Win95以前比较盛行,之后由于出册表等技术的出现,ini技术主键退居二线,不过对于一些小项目,读写ini文件还是很适用的. Windows API提供了读写配置文件的操作,在C#程序中只 ...

  7. 在.NET中读写INI文件 ——兼谈正则表达式的应用

    INI文件是Windows平台上的一种较常用的软件配置文件格式,Windows应用程序常常使用它来保存一些配置信息.它一般是由数个包含key-value对的Section组成,每个key-value对 ...

  8. c# 利用动态库DllImport(kernel32)读写ini文件(提供Dmo下载)

    c# 利用动态库DllImport("kernel32")读写ini文件 自从读了设计模式,真的会改变一个程序员的习惯.我觉得嘛,经验也可以从一个人的习惯看得出来,看他的代码编写习 ...

  9. Qt使用QSettings读写ini文件

    Qt使用QSettings读写ini文件 文章目录 Qt使用QSettings读写ini文件 1. 前言 2. 示例及代码 1. 前言 在项目中有的配置不希望在界面中展示,只提供给实施运维人员来配置, ...

  10. MFC读写ini文件方法

    在我们的程序设计中经常需要对一些参数进行配置,配置好后还要在下一次启动仍然有效,那么一个有效的可行办法就是使用ini文件,也就是Windows初始化文件来保存一些我们的设置,然后让程序启动的时候从这个 ...

最新文章

  1. 关于为何推崇交易规范排序(CTOR)的原因
  2. php函数多个参数_php中,用函数,如果有很多个参数,只使用最后一个参数,有什么优雅的写法?...
  3. java的知识点13——多态、对象的转型(casting)、final关键字、抽象方法和抽象类、接口的作用、如何定义和使用接口?、接口的多继承、面向接口编程
  4. mysql分库分表总结
  5. teamviewer 可用设备上限_2020:抚州办公楼采暖设备种类齐全
  6. Python3小程序:把连续的16进制UTF8编码转换为字符串
  7. HTTP最常见的响应头
  8. 微信小程序项目笔记以及openId体验版获取问题
  9. 蓝桥杯 ADV-176 算法提高 陶陶摘苹果
  10. java契约_基于契约式设计的Java编译器实现
  11. winform C#中Byte与String的转换方法,相互转换
  12. 数组越界也可以这么巧~~~
  13. l360清零软件无响应_爱普生epson l360清零软件免费版
  14. 一、为何我决定写Spring Cloud专栏
  15. latex公式图片识别(转换为latex语法格式)
  16. VS2017卡在登录界面问题
  17. 学计算机装机,DIY新手电脑装机教程:自己组装电脑全过程详细图解教学
  18. 用WIN汇编开发桌面报时工具
  19. 基于SpringBoot的城市建设用地管理系统的设计与实现
  20. PS2021 入门使用技巧

热门文章

  1. html改变游戏速度变慢,游戏不顺畅,卡顿的显卡设置方法
  2. terminal mysql_MySQL的终端(Terminal)管理数据库、数据表、数据基本操作
  3. MyBatis常见问题和解决方法
  4. 求素数的python程序_Python编程新手看过来,如何求素数 (Python学习教程)
  5. 微信小程序怎么让图片充满屏幕_小程序怎么为微信引流?微信小程序的裂变模式...
  6. stm32 串口2空闲中断死机_STM32F373 串口空闲中断问题
  7. 判断数组中是否包含某一项 indexof 重复的判断不准_「JavaScript」: 老生常谈,数组类型...
  8. 2016河北省职称计算机考试试题及答案,2016年最新河北省职称计算机考试试题及答案..doc...
  9. vue写数字翻牌效果_封装vue版数字翻牌器
  10. 小菜找实习——阿里3月27日场笔试第一题