假如,原配置文件中没有[VERB]这个段,
我想通过程序来加上这个段,能有对应的API吗?比如,原来的配置文件格式如下:
[AAA]
NAME=li
AGE=18
[BBB]
SCORE=80
在原基础上,用程序能否实现如下格式的配置文件?
[AAA]
NAME=li
AGE=18
[BBB]
SCORE=80
[VERB]
Count=5
好象没有这样的API?谢谢
我想通过程序来加上这个段,能有对应的API吗?比如,原来的配置文件格式如下:
[AAA]
NAME=li
AGE=18
[BBB]
SCORE=80
在原基础上,用程序能否实现如下格式的配置文件?
[AAA]
NAME=li
AGE=18
[BBB]
SCORE=80
[VERB]
Count=5
好象没有这样的API?谢谢
解决方案 »
- 如何在编辑框内显示TXT文件中的大量数据?
- vs2008 ado 连接 sql2000的问题,急
- VB写的ActiveX中函数使用了Variant参数,vc如何调用
- AfxMessageBox( _T( "" ), MB_OK )怎样显示int、float等啊?
- VC怎样把一个图片分割成三角形(毕业设计)急急!!!!
- 求助:VC程序无法在其他机器上运行?
- 导入数据倒excel
- 怎样调用IE,简单问你,高分相送!
- 那重点该注意VC里面的什么东西了?
- 请问哪里有关于使用Visual C++进行数据库编程的例子,或者电子书,或者图书可以下载?
- 如何跨session枚举窗口,急
- 有什么控件可以包容多个子控件?
temp.Format("%d",5);
::WritePrivateProfileString("VERB","COUNT",temp,"config.ini");
temp.Format("%d",5);
::WritePrivateProfileString("VERB","COUNT",temp,"config.ini");
这种方法正确
先感谢一下kevin_darkelf() 、
wmquan() 、qinzhen228() 、gezhi_dove(gezhi)虽然分不多,但表达我对你们提醒帮助的謝意! 一会结貼。
/*******************************************************************************
*Copyright (c) All rights reserved
*文件名称:ConfFile.h
*模 块 名:通用
*功能描述:配置文件(INI文件)读操作
*当前版本:1.0
*作 者:
*完成日期:
*取代版本:
*原作者 :
*完成日期:
*修改记录:
* 日期 版本 作者 修改描述
********************************************************************************
*******************************************************************************/
#ifndef __CConfFile_H__
#define __CConfFile_H__#include <string>
#include <map>
#include <vector>
using std::string;
using std::map;
using std::vector;#include <stdio.h>
#include <fstream>
using std::fstream;#pragma warning( disable : 4996)
/**
* 本类处理配置文件。
* 配置文件的格式和windows的INI文件一样:
* [class]
* key1 = value1
* key2 = value2
* [class2]
* key1 = value1
* key2 = value2
*/class CConfFile
{
public:
// CConfFile(void);
// virtual ~CConfFile(void);
// //从配置文件读入数据
// bool Load(const char * filename);
// bool Save(char * filename=0);
// //查询某类中的某个键所对应的值
// void * Find(const char * sClass,
// const char * sKey);
//
// char * GetString(const char * sClass, const char * sKey);
// long GetInteger(const char * sClass, const char * sKey);
// double GetFloat(const char * sClass, const char * sKey);
//
// void SetString(const char * sClass, const char * sKey, const char * sValue);
// void SetInteger(const char * sClass, const char * sKey, long lValue);
// void SetFloat(const char * sClass, const char * sKey, double dValue);
//protected:
// //添加一行数据
// void LoadLineData(string &str);
// string & Trim(string &str);
// string & LowerCase(string &str);protected:
//数据结构:保存Section和它所包括的所有Key值
struct ClassData
{
string m_sClass; //类名
map<string, string> m_Pair;//键-值表
bool operator == (const ClassData& r)const
{
if( &r==this ) return true;
return (m_sClass == r.m_sClass) &&
(m_Pair == r.m_Pair);
}; bool operator != (const ClassData& r)const
{
return !(*this == r);
}
}; //数据对象
vector< ClassData > m_Data;
//文件名称
string m_strFileName;
//};
public:CConfFile(void){};
virtual ~CConfFile(void){};protected:
/*******************************************************************************
函数名称: CConfFile::Trim
描 述 : 清除字符串前后的空格
调用函数:
调用者 :
输入参数: string &str 需要清除的字符串
输出参数:
返回值 : string &清除后的字符串
备注 :
*******************************************************************************/
string & Trim(string &str)
{
string::size_type pos;
pos = str.find_first_not_of(' ');
if (string::npos!=pos)
{
str.erase(0, pos);
} pos = str.find_last_not_of(' ');
if (string::npos!=pos)
{
str.erase(pos+1, str.length());
}
return str;
}/*******************************************************************************
函数名称: CConfFile::LowerCase
描 述 : 将字符串所有大写字符转化为小写
调用函数:
调用者 :
输入参数: string &str 需要修改的字符串
输出参数:
返回值 : string &转换后的字符串
备注 :
*******************************************************************************/
string & LowerCase(string &str)
{
char * pTemp = (char*)str.c_str();
char count = 'a' - 'A';
while ( *pTemp != 0 )
{
if( *pTemp>='A' && *pTemp<='Z' )
{
*pTemp += count;
}
pTemp++;
}
return str;
}/*******************************************************************************
函数名称: CConfFile::LoadLineData
描 述 : 分析一行INI文件数据,注释丢弃,保存Section和Key值
调用函数:
调用者 :
输入参数: string &str 输入的行数据
输出参数:
返回值 : void
备注 :
*******************************************************************************/
void LoadLineData(string &strLine)
{
string::size_type pos1;
string::size_type pos2; Trim(strLine);
//是否是注释
pos1 = strLine.find(';');
if ((string::npos != pos1) && (pos1 == 0) )
{
return;
} //是否是Key
pos1 = strLine.find('=');
if ((string::npos != pos1) && //是否有=号存在
(pos1 != 0) && //等号的位置不等于0
(m_Data.size() > 0)) //已经有Section存在
{
string strKey = strLine.substr(0, pos1);
string strValue = strLine.substr(pos1+1, strLine.length()-pos1-1); Trim(strKey);
Trim(strValue);
LowerCase(strKey); m_Data[m_Data.size()-1].m_Pair[strKey] = strValue; return;
}
//是否是Section
pos1 = strLine.find('[');
pos2 = strLine.find(']');
if ((string::npos != pos1) && (string::npos != pos2))
{
string strSection = strLine.substr(pos1+1, pos2-pos1-1);
LowerCase(strSection);
//添加一个ClassData
ClassData data;
data.m_sClass = strSection;
m_Data.push_back(data);
return;
} //其他类型的行
}public:
/*******************************************************************************
函数名称: CConfFile::Load
描 述 : 读取输入的INI文件内容
调用函数:
调用者 :
输入参数: const char * filename 文件名称
输出参数:
返回值 : void
备注 :
*******************************************************************************/
bool Load(const char * filename)
{
m_strFileName = filename; char szBuf[1024];
fstream file;
file.open(m_strFileName.c_str(), std::ios_base::in);
if ( file.fail() )
{
return false;
} while( file.getline(szBuf, 1024) )
{
string strTemp = szBuf;
LoadLineData(strTemp);
} file.close(); return true;}
bool Save(char * filename=0)
{
char * outfilename = filename;
if ( filename == 0 )
outfilename = (char*)m_strFileName.c_str(); //保存
fstream file;
file.open(outfilename, std::ios_base::out);
if ( file.fail() )
return false; file.clear();
//获取数据字符串
string strData; vector<ClassData>::iterator VI;
for(VI=m_Data.begin(); VI!=m_Data.end(); VI++)
{
strData += "[";
strData += (*VI).m_sClass;
strData += "]\n"; map<string, string> * pKeyMap = &((*VI).m_Pair);
map<string, string>::iterator MI;
for (MI=pKeyMap->begin(); MI!=pKeyMap->end(); MI++)
{
strData += (*MI).first;
strData += "=";
strData += (*MI).second;
strData += "\n";
}
} //写到文件
file.write(strData.c_str(), (int)strData.size()); file.close(); return true;
}/*******************************************************************************
函数名称: CConfFile::Find
描 述 : 查询某类中的某个键所对应的值
调用函数:
调用者 :
输入参数: const string sClass 类名, 不区分大小写
const string sKey 键名, 不区分大小写
string& sValue 健值, 传入缺省值, 传出新值
输出参数:
返回值 : void
备注 :
*******************************************************************************/
void * Find(const char * sClass,
const char * sKey)
{
string strSection = sClass;
string strKey = sKey; LowerCase(strSection);
LowerCase(strKey); vector<ClassData>::iterator VI;
for(VI=m_Data.begin(); VI!=m_Data.end(); VI++)
{
if ( (*VI).m_sClass == strSection)
{
return (void*)(((*VI).m_Pair)[strKey].c_str());
break;
}
} return 0;
}/*******************************************************************************
函数名称: CConfFile::GetString
描 述 : 查询某类中的某个键所对应的字符串值
调用函数:
调用者 :
输入参数: const char * sClass 类名, 不区分大小写
const char * sKey 键名, 不区分大小写
输出参数:
返回值 : char * 字符串表示的Key值
备注 :
*******************************************************************************/
char * GetString(const char * sClass, const char * sKey)
{
void * pValue = Find(sClass, sKey);
return (char*)pValue;
}long GetInteger(const char * sClass, const char * sKey)
{
void * pValue = Find(sClass, sKey);
if ( pValue == 0) return 0;
return atol((char*)pValue);
}double GetFloat(const char * sClass, const char * sKey)
{
void * pValue = Find(sClass, sKey);
if ( pValue == 0) return 0;
return atof((char*)pValue);
}
//如果没有Section则添加
//如果没有Key则添加
//修改Key值
void SetString(const char * sClass, const char * sKey,
const char * sValue)
{
//无效地址
if ( sClass == 0 || sKey == 0 || sValue == 0) return; string strSection = sClass;
string strKey = sKey;
string strValue = sValue; //Section和Key名不能为空
if ( strSection.empty() || strKey.empty() ) return; vector<ClassData>::iterator VI;
for(VI=m_Data.begin(); VI!=m_Data.end(); VI++)
{
if ( strSection == (*VI).m_sClass )
{
(*VI).m_Pair[strKey] = sValue;
return;
}
} //添加section
ClassData data;
data.m_sClass = strSection;
data.m_Pair[strKey] = sValue;
m_Data.push_back(data);
}void SetInteger(const char * sClass, const char * sKey, long lValue)
{
char szBuf[256];
memset(szBuf, 0, 256);
sprintf(szBuf, "%d", lValue);
SetString(sClass, sKey, szBuf);
}void SetFloat(const char * sClass, const char * sKey, double dValue)
{
char szBuf[256];
memset(szBuf, 0, 256);
sprintf(szBuf, "%f", dValue);
SetString(sClass, sKey, szBuf);
}}; //class #endif //__CConfFile_H__