如何用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

}

/***************************************************/