标准c++读写ini文件类
·
本类是在网络上的一个标准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 §ion, const string &key, const string &value );
int ReadInt( const string §ion, const string &key, int value );
bool WriteString( const string §ion, const string &key, const string &value );
bool WriteInt( const string §ion, const string &key, int value );
bool RemoveSection( const string §ion );
bool RemoveKey( const string §ion, 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 §ion, const string &key, const string &value )
{
for( size_t i = 0;i < m_vctLine.size(); ++i )
{
string §ion_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, ÕâÀïµÄϱ껹ÊÇi
for( ++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 again
break;//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 §ion, const string &key, const string &value )
{
for( size_t i = 0;i < m_vctLine.size(); ++i )
{
string §ion_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, ÕâÀïµÄϱ껹ÊÇi
for( ++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 again
break;//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;
}
//δÕÒµ½key
m_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 §ion )
{
for( size_t i = 0;i < m_vctLine.size(); ++i )
{
string §ion_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;
}
//ÕÒµ½ÁËsection
size_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 §ion, const string &key )
{
for( size_t i = 0;i < m_vctLine.size(); ++i )
{
string §ion_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;
}
//ÕÒµ½ÁËsection
for( ++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 §ion, 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 §ion, 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下载资源
更多推荐
所有评论(0)