如何用C++写一个读取文件的类?找到密码...下跪
#ifndef?INIFILE_H_
#定义?INIFILE_H_
#如果?_MSC_VER?& gt?1000
#pragma?一次
#endif?//?_MSC_VER?& gt?1000
#如果?_MSC_VER?& gt?1000
#pragma?警告(禁用:4786)
#endif
#包含?& ltvector & gt
#包含?& lt字符串& gt
#包含?& ltstring.h & gt
//TOFIX?使用?一些?善良?od?地图& lt& gt?去哪?加速?搜索?
使用?命名空间?std
班级?IniFile
{
//Ini?文件?键
班级?IniKey
{
公共:
IniKey(){ };
IniKey(const?IniKey?& amp那){?接线员?=(那个);?}
作废?接线员?=?(const?IniKey?& amp那个)
{
如果(这个?!=?& amp那){//?不要?复制?你自己
m_name?=?that.m _ name
m_value?=?that.m _ value
}
}
//需要?为了什么?搜索?钥匙?目录
布尔?接线员?==?(const?IniKey?& amp那个)?{?回归?0?==?strcmp(m_name.c_str(),?that . m _ name . c _ str());?};
字符串?m _ name//字符串
字符串?m _ value
};
//ini?文件?部分
班级?IniSection
{
公共:
IniSection(){ };
IniSection(const?部门?& amp那){?接线员?=(那个);?}
作废?接线员?=?(const?部门?& amp那个)
{
如果(这个?!=?& amp那){//?不要?复制?你自己
m_name?=?that.m _ name
m_Keys?=?that.m _ Keys
}
}
//需要?为了什么?搜索?节?目录
布尔?接线员?==?(const?部门?& amp那个)?{?回归?0?==?strcmp(m_name.c_str(),?that . m _ name . c _ str());?};
字符串?m _ name
向量& ltIniKey & gt?m _ Keys
};
typedef?向量& ltIniKey & gt* iteratorinikeyerator;
typedef?向量& ltIniSection & gt* iteratorIniSectionIterator;
公共:
IniFile();
虚拟的?~ IniFile();
布尔?Load(const?夏尔?* SZ file);
布尔?save();
内嵌?boolGetDirty()?const?{?回归?m _ bDirty?}
内嵌?字符串?GetPath()?const?{?回归?m _ strPath?}
作废?SetPath(const?夏尔?*szFile)?{?m_strPath?=?szFile?}
//
布尔?clear all();
//读?价值观?在?不一样?格式
布尔?GetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?字符串?& amp值,?const?夏尔?* SZ default);
布尔?GetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?int?& ampn值,?int?ndedefault?=?0);
布尔?GetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?未签名?矮?& ampn值,?int?ndedefault?=?0);
布尔?GetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?布尔?& ampb值,?int?ndedefault?=?0);
//TOFIX?支持?评论?
布尔?SetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?const?夏尔?* SZ val);
布尔?SetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?const?int?nValue);
//bool?SetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?const?布尔?& ampb value);
布尔?KeyExists(const?夏尔?*szSection,?const?夏尔?* szKey);
布尔?SectionExists(const?夏尔?* SZ section);
布尔?AddSection(const?夏尔?* SZ section);
布尔?RemoveSection(常量?夏尔?* SZ section);
布尔?RemoveKey(const?夏尔?*szSection,?const?夏尔?* szKey);
//TOFIX?支持?节/键?枚举?-& gt;?GetXXXCount,?GetXXXName(索引)
向量& lt字符串& gt?get sections();
受保护:
布尔?FindKey(IniKeyIterator?& amp它,?const?夏尔?*szSection,?const?夏尔?* szKey);
布尔?FindSection(IniSectionIterator?& amp它,?const?夏尔?* SZ section);
向量& ltIniSection & gt?m _内容;
字符串?m _ strPath
boolm _ bDirty//是?内容?变了?没有?节约
};
#endif?//?INIFILE_H_
/* * * * * * * * * * * * * * * * * * CPP文件* * * * * * * * * * * * * * * * * * * *
/*
*?IniFile.cpp
*
*/
#包含?" stdafx.h "
#包含?" IniFile.h "
#包含?& lt算法& gt//find()?功能
#包含?& lt字符串& gt
#包含?& ltfstream & gt
#ifdef?_WIN32
#ifndef?__MINGW32__
#定义?snprintf?_snprintf
#endif
#endif
IniFile::IniFile()
{
m_bDirty?=?假的;
}
IniFile::~IniFile()
{
}
布尔?IniFile::Load(const?夏尔?*szFile)
{
m_bDirty?=?假的;//init?旗
m _ contents . clear();?//清除?储存;储备
set path(SZ file);
字符串?线;
//打开?那个?INI?文件?为了什么?阅读
fstream?iniFile(szFile,?IOs::in/* | IOs::no create */);
如果(!iniFile.is_open())
回归?假的;
//读?从哪里?文件?线?被谁?线条
布尔?bDone?=?假的;
夏尔?SZ buffer[4000];
而(!bDone)
{
szBuffer[0]?=?'\0';
iniFile.getline(szBuffer,?sizeof(SZ buffer));
线?=?szBuffer
//是?那个?答?节?在?那个?缓冲器
if('['?==?第[0]行)
{
int?NPO?=?line . find _ first _ of(']');
if(-1?!=?NPO)
{
部门?节;
section.m_name?=?line.substr(1,?nPos-1)。c _ str();
//添加?新的?节?去哪?那个?结束?的?储存;储备
m _ contents . push _ back(section);
}
}
其他
{
//否则?是吗?那个?线?"关键字=值"
int?NPO?=?line . find _ first _ of(' = ');
如果(NPO?& gt?0)//那里?必须?是吗?空间?为了什么?钥匙?名字
{
//添加?新的?钥匙?去哪?那个?最后?节?在?那个?储存;储备
IniKey?关键;
key.m_name?=?line.substr(0,NPO)。c _ str();
key.m_value?=?line.substr(nPos+1,?line.size()-nPos-1)。c _ str();
int?尺寸?=?m _ contents . size();
如果(大小?& gt?0)
{
m_contents[size-1]。m _ keys . push _ back(key);
}
}
}
//检查?为了什么?出口
bDone?=?iniFile.eof()?||?iniFile.bad()?||?inifile . fail();
}
回归?真实;
}
布尔?IniFile::Save()
{
m_bDirty?=?假的;//重置?旗
//确保?目录?存在
//?字符串?斯特迪尔?=?get parent dir(m _ strpath . c _ str());
//EnsureNotTerminated(strDir);
//EnsureDirExists(strDir);//TOFIX?检查?成功
//打开?那个?INI?文件?为了什么?写作
fstream?iniFile(m_strPath.c_str(),?IOs::out | IOs::trunc);
如果(!iniFile.is_open())
回归?假的;
夏尔?SZ buffer[4000];
int?尺寸?=?m _ contents . size();
for(int?I = 0;?我& lt尺寸;?i++)
{
//写?线?用什么?节?名字
snprintf(szBuffer,?sizeof(szBuffer),?"[%s]\n ",m_contents[i]。m _ name . c _ str());
iniFile.write(szBuffer,?strlen(SZ buffer));
int?数数?=?m_contents[i]。m _ keys . size();
for(int?j = 0;?j & lt数数;?j++)
{
//写?“钥匙?=?价值"
snprintf(szBuffer,?sizeof(szBuffer),?" %s=%s\n ",
m_contents[i]。m_Keys[j]。m_name.c_str(),
m_contents[i]。m_Keys[j]。m _ value . c _ str());
iniFile.write(szBuffer,?strlen(SZ buffer));
}
iniFile.write("\n ",?1);
}
回归?真实;
}
布尔?IniFile::ClearAll()
{
m_bDirty?=?真实;
m _ contents . clear();
回归?真实;
}
布尔?IniFile::SectionExists(const?夏尔?*szSection)
{
IniSectionIterator?它;
回归?FindSection(它,?SZ section);
}
布尔?IniFile::KeyExists(const?夏尔?*szSection,?const?夏尔?*szKey)
{
IniKeyIterator?它;
回归?FindKey(它,?szSection,?szKey);
}
布尔?IniFile::GetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?字符串?& amp值,?const?夏尔?*szDefault)
{
IniKeyIterator?它;
if(FindKey(它,?szSection,?szKey)){
价值?=?它-& gt;m _ value
回归?真实;
}
价值?=?szDefault
回归?假的;
}
布尔?IniFile::GetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?int?& ampn值,?int?NDE default)
{
IniKeyIterator?它;
if(FindKey(它,?szSection,?szKey)){
n值?=?atoi(It-& gt;m _ value . c _ str());
回归?真实;
}
n值?=?ndedefault;
回归?假的;
}
布尔?IniFile::GetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?未签名?矮?& ampn值,?int?NDE default)
{
IniKeyIterator?它;
if(FindKey(它,?szSection,?szKey)){
n值?=?atoi(It-& gt;m _ value . c _ str());
回归?真实;
}
n值?=?ndedefault;
回归?假的;
}
布尔?IniFile::GetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?布尔?& ampb值,?int?NDE default)
{
IniKeyIterator?它;
if(FindKey(它,?szSection,?szKey)){
b值?=?atoi(It-& gt;m_value.c_str())?& gt?0;
回归?真实;
}
b值?=?ndedefault?& gt?0;
回归?假的;
}
布尔?IniFile::SetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?const?int?nValue)
{
夏尔?szNumber[30]?=?"";
snprintf(szNumber,sizeof(szNumber),?" %d ",nValue);
回归?SetValue(szSection,szKey,?SZ number);
}
布尔?IniFile::SetValue(const?夏尔?*szSection,?const?夏尔?*szKey,?const?夏尔?*szVal)
{
m_bDirty?=?真实;//内容?变化
IniKeyIterator?它;
if(FindKey(它,?szSection,?szKey))
{
它-& gt;m_value?=?szVal//更新?现有?键
回归?真实;
}
if(add section(szSection))//确保?节?存在
{
IniSectionIterator?SecIt
if(FindSection(SecIt,szSection))
{
IniKey?关键;
key.m_name?=?szKey
key.m_value?=?szVal
SecIt-& gt;m _ keys . push _ back(key);
回归?真实;
}
}
回归?假的;
}
布尔?IniFile::AddSection(const?夏尔?*szSection)
{
m_bDirty?=?真实;//内容?变化
IniSectionIterator?它;
如果(!FindSection(它,?szSection))
{
部门?节;
section.m_name?=?szSection
m _ contents . push _ back(section);
回归?真实;
}
回归?真实;//section?已经吗?存在
}
布尔?IniFile::RemoveSection(const?夏尔?*szSection)
{
IniSectionIterator?它;
if(FindSection(It,?szSection))
m _ contents . erase(It);
回归?真实;
}
布尔?IniFile::find section(IniSectionIterator?& amp它,?const?夏尔?*szSection)
{
部门?节;
section.m_name?=?szSection
它?=?find(m_contents.begin(),?m_contents.end(),?节);
回归?(它?!=?m _ contents . end());
}
布尔?IniFile::find key(inikey iterator?& amp它,?const?夏尔?*szSection,?const?夏尔?*szKey)
{
IniSectionIterator?SecIt
if(FindSection(SecIt,szSection))?//section?存在
{
IniKey?关键;
key.m_name?=?szKey
它?=?查找(SecIt-& gt;m_Keys.begin(),?SecIt-& gt;m_Keys.end(),?关键);
回归?(它?!=?SecIt-& gt;m _ keys . end());
}
回归?假的;
}
向量& lt字符串& gt?IniFile::GetSections()
{
向量& lt字符串& gt?strVector
for(vector & lt;IniSection & gt*迭代器?itor?=?m _ contents . begin();伊托!= m _ contents . end();++itor)
{
IniSection*?sec?=?(I section *)(itor);
str vector . push _ back(sec-& gt;m _ name);
}
回归?strVector
}
/***************************************************/