返回首页

{A}简介
这是一个进一步的探索,如果INI文件类主题象雄健(xiaohe521)和亚当(aejw)开始的代码项目。其主要思想仍然是几乎相同的:类是一个读/写INI文件的Win32 API周围的瘦包装。但是,我试图齿轮对MFC我的课。
这个类可能是有用的,如果你的应用程序需要访问注册表和INI文件,或多个INI文件。否则,你可以使用AfxGetApp()- GT; m_pszProfileName和AfxGetApp()- GT GetProfileXXXX (???.类的声明

class CIniFile : public CObject

{

public:

 CIniFile(LPCTSTR lpIniFileName, INT iMaxStringLength);

 virtual  CIniFile();
{C}
// Operations

public:

 CString GetIniFileName();

 void SetIniFileName(LPCTSTR lpIniFileName);

 BOOL GetStatus(CFileStatus& rStatus);
 void GetString(LPCTSTR lpSection, LPCTSTR lpKey, 

		CString& strRet, LPCTSTR strDefault);

 UINT GetInt(LPCTSTR lpSection, LPCTSTR lpKey, INT iDefaultValue); 

 FLOAT GetFloat(LPCTSTR lpSection, LPCTSTR lpKey, FLOAT fDefaultValue);

 BOOL GetStruct(LPCTSTR lpSection, LPCTSTR lpKey, 

		LPVOID lpRetStruct, UINT iSizeStruct);

 void GetSectionNames(CStringList& lstSectionNames);
 BOOL WriteSection(LPCTSTR lpSection, LPCTSTR lpData); 

 BOOL WriteString(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpString);

 BOOL WriteNumber(LPCTSTR lpSection, LPCTSTR lpKey, INT iValue);

 BOOL WriteNumber(LPCTSTR lpSection, LPCTSTR lpKey, FLOAT fValue);

 BOOL WriteStruct(LPCTSTR lpSection, LPCTSTR lpKey, 

		LPVOID lpStruct, UINT iSizeStruct);
 BOOL RemoveKey(LPCTSTR lpSection, LPCTSTR lpKey); 

};
类实现
的实现非常简单。它是基于以下的API函数:GetPrivateProfileSectionNamesGetPrivateProfileStructGetPrivateProfileStringGetPrivateProfileIntWritePrivateProfileStructWritePrivateProfileStringWritePrivateProfileSection
下载源代码的细节(这是相当良好的注释)。演示应用/测试台
下面的控制台应用程序,它的类的方法。输出去的afxDump。
// just a dummy structure to write/read to/from the INI file

struct TestStruct : public POINT

{

 char charr[8];

};

// PURPOSE: test bed for the INI file class

void TestIniClass()

{

 CIniFile iniFile(".\\test1.ini", 1024);

 iniFile.SetIniFileName(".\\test2.ini");     		// change the file name 

					 // after the class has bee created
 // test the writing to the INI file

 iniFile.WriteSection("section1", "key1=test1\x000key2=test2"); // make a section 

							// with 2 new keys

 iniFile.WriteSection("section2", "key1=test1");   	// make another section

 iniFile.WriteString("section1", "key3", "test3");  	// create a new key

 iniFile.WriteString("section1", "key2", "test4");  	// update an existing key

 iniFile.WriteString("section1", "key1", NULL);   	// remove an existing key

 iniFile.RemoveKey("section1", "key3");     		// remove another existing key

 iniFile.WriteNumber("section1", "key4", 123);   	// write an integer 

						// to a new key

 iniFile.WriteNumber("section1", "key5", -123);   	// write a negative integer 

						// to a new key

 iniFile.WriteNumber("section1", "key6", -123.456f);  	// write a float to a new key

 TestStruct writeTestStruct;

 writeTestStruct.x = 6;

 writeTestStruct.y = 7;

 strcpy(writeTestStruct.charr, "abcdefg");

 iniFile.WriteStruct("section1", "key7", &writeTestStruct, sizeof(TestStruct));

 

 // Test the reading from the INI file

 CString str;           // string that will receive the output 

 iniFile.GetString("section1", "key2", str, "default"); TRACE("key2=%s\n", str);

 iniFile.GetString("section1", "nokey", str, "default"); 

	TRACE("nokey=%s\n", str); // non-existent key

 iniFile.GetString("section3", "key1", str, "default"); TRACE("nokey=%s\n", str);

 TRACE("key4=%d\n", iniFile.GetInt("section1", "key4", 0));

 TRACE("key5=%d\n", iniFile.GetInt("section1", "key5", 0));

 TRACE("key6=%f\n", iniFile.GetFloat("section1", "key6", 0));

 TestStruct readTestStruct;

 iniFile.GetStruct("section1", "key7", &readTestStruct, sizeof(TestStruct));

 TRACE("key7= %ld %ld %s\n", readTestStruct.x, 

	readTestStruct.y, readTestStruct.charr);
 // Test the section list retrieval

 CStringList lstSectionNames;

 iniFile.GetSectionNames(lstSectionNames); 

 TRACE("Sections:\n");

 for (POSITION pos = lstSectionNames.GetHeadPosition(); pos != NULL; )

 {

  TRACE("\t%s\n", lstSectionNames.GetNext(pos));

 }

}

有什么应该是固定的,补充或在这个项目中中删除的吗?请让我知道!参考文献
[1]
[2]
[3] 修订历史冯0.1初稿尼克Alexeev2006年11月24日,日冯0.2新增的异常处理尼克Alexeev2006年11月30日,日

回答

评论会员:罗杰贡萨尔维斯 时间:2011/12/07
我已在MFC中创建一个示例程序来读取INI文件存储在C:\ MyFolder中\ MyFile.ini
我已通过ini文件的路径为C:\ MyFolder中.. \ MyFile.ini 这在XP的罚款。相同的代码不能正常工作在Vista(最终服务包2)
评论会员:。pbturner 时间:2011/12/07
我用VC 2005 Express版。下载zip文件。复制IniFile.cpp H - 还需要从演示IniFileClass.h文件 - 我的项目所在的目录。增加了IniFile.cpp项目。试图建设的解决方案,但得到的许多错误 - 第一是"错误C2504:"CObject的":未定义基类"。我敢肯定,这是愚蠢的事情 - 也许我是如何定义的项目和/或设置或2的。
我的新环境(2005年版),但在C / C + +编码超过15年。 有什么建议? TIA的。
PBT。
评论会员:尼克Alexeev 时间:2011/12/07
PBT,

你是什​​么类型的项目创建:MFC,控制台,或与MFC支持的控制台?我会建议使用MFC支持MFC或控制台。

欢呼声,
尼克

P.S.我仍在使用好老的VC 6.0。我没有给VC 200X一个严重的尝试。
- 修改一时11分星期五11th五月,2007
评论会员:pbturner 时间:2011/12/07
您好尼克,

我不会在这件事情2005年(VC)要么如果不是事实,我们已经有了一个供应商发展为我们的产品和他们使用的是什么。我们公司是目前使用Borland C(6.0年和2006年),但我们很多人都MS V Studio的经验(旧版本)。
我在这个新环境的第一,因为我可能会被人接管这个"新产品"的支持。
我有一个应用程序(在Borland用C + + Builder 6.0中创建)从INI文件中读取并显示在ListBox中的详细信息。从那里,用户选择列表框中的项目之一,然后一组复选框中的一些项目。很简单。它不会难,2005年在VC中重新创建。

无论如何,我所做的,是创建一个新的"Windows窗体应用程序"类型的应用程序,因为这似乎是最好的选择"已安装的模板"。我的其他选择"类库","CLR空项目","CLR控制台应用程序",我选择一个。从那里,它会自动为你的选择/设置。在项目选择,它支持MFC和ATL

创建一些对象,按钮,部件等一切都很好到目前为止屏幕。现在有趣的部分。想尝试和读取从INI文件中的值,像以前一样,但一直有一个真正与曾经被认为是一个非常简单的操作类型(字符串,ini文件等)的困难时期。跨评论来到另一个支持组表示,VC 2005开始编程101。混乱,我敢肯定,做的完全转换到托管类(?)和更严格的环境。,

试图简单地包括到项目中IniFile.cpp的地方去南。我的思想,在项目设置中定义的MFC中,应该有CObject的定义。再次,我很假设,这大多数是由于我的经验不足,与2005年的VC环境。

任何支持/意见/帮助您可以提供。

PBT。 (皮特)。
评论会员:jfrancis 时间:2011/12/07
我正在寻找一个简单容易插入到我的设计


{S0}
评论会员:尼克Alexeev 时间:2011/12/07
一体化呢?任何建议或错误? {S0}
评论会员:nickhalfasleep 时间:2011/12/07
尼克,
我作为以及发现它很容易集成和使用以及的。
我不得不做出的唯一的变化是在源代码下载(不完整的项目)在IniFile.cpp的,它包含测试类:

包括"IniFileClass.h"

这是没有必要进行生产。

感谢伟大的代码,
另一个尼克
评论会员:马克Nischalke 时间:2011/12/07
如何更ini文件作家世界的需要。

远离作为一个资产只有​​两个字母
评论会员:怀疑论者鼹鼠 时间:2011/12/07
标记Nischalke写道:有多少,我们需要

我们是谁? {S2}
评论会员:阿布真身 时间:2011/12/07
我对此表示欢迎
{S0}

如果主神全能者开始后,创作之前曾征询我,我会建议简单的东西。
 60; - 阿方索的智者,13世纪卡斯提尔王
评论会员:斯蒂芬休伊特 时间:2011/12/07
7 - 这是我最好的猜测。
评论会员:尼克Alexeev 时间:2011/12/07
也许多达有string类....

史蒂夫
评论会员:cpallini 时间:2011/12/07
...或像许多解析器/标记生成器类。我刚刚提交了一个又一个。 {S0}
评论会员:尼克Alexeev 时间:2011/12/07
LPTSTR的GetBuffer(INT nMinBufLength)
可能会引发CMemoryException。
  ;即使它是不可能的事件,你应该处理这个问题
{S0}

如果主神全能者开始后,创作之前曾征询我,我会建议简单的东西。
- 阿方索的智者,13世纪卡斯提尔王
评论会员:cpallini 时间:2011/12/07
我想,最简单的方法处理部份效果异常会没有拨打电话回默认值:GetPrivateProfileString()和调用pExc。 >了reportError()。什么会是一个更好的 - 但仍然通用 - 的方式?
评论会员:尼克Alexeev 时间:2011/12/07
另一种解决方案可能使你的方法抛出该异常给调用者
我现在没有哪一种方式更好。

如果主神全能者开始后,创作之前曾征询我,我会建议简单的东西。
& #160; - 阿方索的智者,13世纪卡斯提尔王
评论会员:尼克Alexeev 时间:2011/12/07
正如你推荐了,我已经添加了异常处理INI文件类。 CString的::GetFuffer如果抛出一个异常,我的方法捕获和重新抛出给调用函数。我算了一下,如果有一个内存不足,更高层次的应用,应充分意识到这一点。

坦白说,我是相当新的异常处理。但是,我学习它的更好的是从一开始就到了成熟的代码,而不是试图以"转"的异常处理,思考异常处理。

欢呼声,
尼克