#ifndef _READCONFIG_H_
#define _READCONFIG_H_
#include <string>
#include <map>
#include <vector>
#include <iostram>
#include <fstream>
#define MAX_BUFFLEN 1024
typedef map< string, string, less<string> > strMap;
typedef strMap::iterator strmapIt;
const char * const MIDDLESTRING = "__**__";
using namespace std;
// 此类用于格式化string字符串
class SString : public string
{
public:
SString &Format(const char *_format, ...)
{
char szBuffer[MAX_BUFFLEN];
memset(szBuffer, 0x00, sizeof(szBuffer));
va_list ap;
va_start(ap, _format);
try
{
vsnprintf(szBuffer, MAX_BUFFLEN, _format, ap);
}
catch(...)
{
cout<<"ERROR: format the string failed..."<<endl;
return *this;
}
va_end(ap);
this->append(szBuffer);
return *this;
}
};
// 该类用于根据传入的数据,将数据存入map中
class CAnalyzeValue
{
private:
string m_strSect;
strMap *m_pMap;
public:
CAnalyzeValue(strMap &strmap):m_pMap(&strmap)
{
m_strSect = "";
}
~CAnalyzeValue()
{
}
void operator () (const string &strInput) const
{
int iFirst = strInput.find('[');
int iLast = strInput.find(']');
if (iFirst != string::npos && iLast != string::npos && iFirst != iLast + 1)
{
m_strSect = strInput.substr(iFirst + 1, iLast - iFirst - 1);
return;
}
if (m_strSect.empty())
{
return;
}
iFirst = strInput.find('=');
if (iFirst == string::npos)
{
return;
}
string strTemp1 = strInput.substr(0, iFirst);
string strTemp2 = strInput.substr(iFirst + 1, string::npos);
iFirst = strTemp1.find_first_not_of(" /t");
iLast = strTemp1.find_last_not_of(" /t");
if (iFirst == string::npos || iLast == string::npos)
{
return;
}
string strKey = strTemp1.substr(iFirst + 1, iLast - iFirst + 1);
iFirst = strTemp2.find_first_not_of(" /t");
if (((iLast = strTemp2.find("/t#", iFirst)) != string::npos) ||
((iLast = strTemp2.find(" #", iFirst)) != string::npos) ||
((iLast = strTemp2.find("/t//", iFirst)) != string::npos) ||
((iLast = strTemp2.find(" //", iFirst)) != string::npos))
{
strTemp2 = strTemp2.substr(0, iLast - iFirst);
}
iLast = strTemp2.find_last_not_of(" /t");
if (iFirst == string::npos || iLast == string::npos)
{
return;
}
string strValue = strTemp2.substr(iFirst, iLast - iFirst + 1);
string strMapkey = m_strSect + MIDDLESTRING;
strMapkey += strKey;
(*m_pMap)[strMapkey] = strValue;
return;
}
};
// 此类用于读取配置文件
class CReadConfig
{
public:
CReadConfig()
{
}
~CReadConfig()
{
}
bool OpenFile(const char *FileName)
{
return
}
string ReadCfg(const char * pSect, const char * pKey)
{
string strMapKey = pSect;
strMapKey += MIDDLESTRING;
strMapKey += pKey;
strmapIt iter;
iter = mapcfg.find(strMapKey);
if (iter == mapcfg.end())
{
return "";
}
else
{
return iter->second;
}
}
protected:
bool Do_OpenFile(const char *FileName)
{
ifstream fin(FileName);
if (!fin.is_open())
{
return false;
}
vector<string> strVect;
while (!fin.eof())
{
string strInput = "";
getline(fin, strInput, '/n');
strVect.push_back(strInput);
}
if (strVect.empty())
{
return false;
}
for_each(strVect.begin(), strVect.end(), CAnalyzeValue(mapcfg));
}
private:
strMap mapcfg;
};
#endif
分享到:
相关推荐
标题中的“ini读取类,使用C++STL”指的是使用C++标准模板库(Standard Template Library, STL)来设计和实现一个能够读取和操作.ini配置文件的类。.ini文件是一种常见的文本配置文件格式,常用于存储软件的设置和...
在这个主题中,我们将深入探讨STL的使用以及如何处理文件读取和格式转换。 首先,让我们从STL的基本概念开始。STL的核心组件包括: 1. 容器:如vector、list、deque、set、map等,它们用于存储和管理数据。 2. 迭代...
- 通过对STL文件格式的详细分析,结合C++标准库的文件流读取功能以及OpenGL中的三角面片绘制技术,可以在VC++平台上实现对STL文件的有效读取和显示。这种技术在逆向工程、快速成型等领域有着广泛的应用前景。
标题 "用STL实现的ini文件操作类" 描述了一个使用C++标准模板库(STL)来处理ini配置文件的程序。ini文件是一种常见的文本格式,用于存储应用程序的配置设置。这种实现允许读取、写入和修改ini文件中的数据,以适应...
在IT行业中,配置文件是软件系统中不可或缺的一部分,它们存储应用程序的设置、参数或环境信息,使得程序可以根据用户的需求或特定环境进行个性化调整。而INI文件是一种常见的配置文件格式,尤其在Windows系统中广泛...
INI文件是一种常见的文本配置文件格式,通常用于存储软件的设置和选项,结构简单,易于读写。 INI文件的基本结构由节(Section)、键(Key)和值(Value)组成。节用方括号([])包围,键值对则以等号(=)分隔。例如:...
`string`可以通过各种方法进行格式化,如使用C语言的`snprintf`或者C++的`std::stringstream`。 **1.9 `string`与`CString`** 在MFC中,`CString`是一个广泛使用的类,用于处理字符串。它提供了一些额外的功能,如...
### STL实现的数据结构部分算法详解 #### 杨辉三角的STL实现 在代码示例`4_1.cpp`中,我们看到一个使用C++标准模板库(STL)中的`queue`容器来生成和打印杨辉三角的例子。杨辉三角是一种在数学上常见的数列,每一...
在C++实现STL reader时,可以使用标准模板库(Standard Template Library, STL)中的容器,如`std::vector`来存储顶点和法线信息,利用`std::ifstream`进行文件流操作,以及`std::string`处理文本数据。同时,为了...
这个系统涵盖了基础的控制台交互、文件操作以及标准模板库(STL)中的容器应用。下面我们将详细分析涉及的知识点。 1. **C++基础知识**: - **变量与数据类型**:在ATM系统中,会用到各种数据类型,如整型(int)...
1. 数据预处理:在C++中实现关联规则的第一步是数据预处理,包括读取数据集、将数据转换为适合关联规则挖掘的格式,如交易列表。这通常涉及到文件I/O操作,例如使用fstream库读写文件,以及对字符串的处理,例如用...
在这个基于STL的简易字典项目中,我们利用了STL中的容器(如`std::map`)和输入/输出(IO流)功能来实现一个能够读取文件、存储和查询字典数据的程序。以下是这个项目的详细知识点: 1. **STL中的`std::map`**: `...
本文将详细探讨如何使用C++的STL(Standard Template Library,标准模板库)来实现ini文件的读写操作,以及提供一个基于VS2019社区版的完整项目案例。 1. ini文件基础: ini文件通常包含多个section(段),每个...
根据给定的文件信息,我们可以深入探讨C++标准库(STL)的关键概念与细节,这份文档由IBM公司内部制作,作为C++ STL参考手册,提供了丰富的信息与指导,涵盖从基本的C库到复杂的C++特性,以及STL的重要组成部分。...
尤其是在C++这类支持多种编码环境的编程语言中,编写出能够读取包括ANSI、BOM UTF-8、UTF-8、GB 18030、UTF-16 BE和UTF-16 LE等不同编码格式的文本文件的源码,对于国际化应用的开发尤为重要。本文将详细介绍如何在...
7. **格式化输出**:C++11引入了`std::stringstream`,可以方便地进行格式化输出,如`std::stringstream ss; ss , Value: " ; std::string result = ss.str();`。 8. **正则表达式**:从C++11开始,标准库中提供了`...
格式化输入涉及读取数据并将其转换为程序可以处理的形式。 - **扫描格式**:定义了如何解析输入数据的格式。 - **扫描函数**:提供了几种用于格式化输入的标准函数。 - **扫描转换说明符**:解释了如何使用转换说明...
理解如何使用这些对象进行格式化输出、读取用户输入以及异常处理是C++编程的基础。 第四,STL容器是C++中组织和管理数据的关键组件,包括数组(`array`)、向量(`vector`)、列表(`list`)、映射(`map`)、集合...
3. **C函数库**:C++兼容C语言,因此也包含C标准库中的函数,如`printf`和`scanf`进行格式化输入输出,`malloc`和`free`进行动态内存分配和释放,`strcpy`和`strcat`处理字符串操作。 4. **IOstream操作库**:C++的...