`
isiqi
  • 浏览: 16593214 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

[DEV] 编程经验之:如何保存配置信息

阅读更多

我的编程经验之一 程序配置信息的保存

在我们编写的每一个程序中,我们都要保存一些有用的信息,如何保存这些信息呢?
比较常用的有三种方法,一种是使用注册表,一种是使用Ini文件,还有就是使用文件。
采用那种方法保存配置信息,不同的人可能有不同的习惯,这三种方法那种最适合你
的程序呢,究竟那个最方便呢?
一、使用注册表
在BCB中有个TRegistry,它提供了方便的注册表操作,它有几个重要的属性和方法。
如下:
__property HKEY RootKey = {read=FRootKey, write=SetRootKey, nodefault};
这个属性用来设置和取得当前的根键。在默认情况下它的值是HKEY_CURRENT_USER。
这个属性是我们常常用到的。
bool __fastcall OpenKey(const AnsiString Key, bool CanCreate);
这个方法用来打开一个键,bool CanCreate是表示如果这个键不存在则是否创建这个
键,true是创建。如果打开成功返回true。
void __fastcall CloseKey(void);
这个方法关闭当前打开的键,当你完成注册表的修改后,应该调用此方法来保存您的
修改。
bool __fastcall KeyExists(const AnsiString Key);
这个方法判断一个键是否存在。
bool __fastcall ValueExists(const AnsiString Name);
这个方法判断当前键下是否存在指定的数据项。
AnsiString __fastcall ReadString(const AnsiString Name);
这个方法从当前键下指定的数据项读取一个字符串。
void __fastcall WriteString(const AnsiString Name, const AnsiString Value);
这个方法向当前键下指定的数据项写入一个字符串。类似的函数还有ReadInteger,
WriteInteger,ReadBool,WriteBool等方法,这里就不一一列举了,请大家看一下在
线帮助就可以了,下面我举一个使用注册表保存和读取程序配置信息的例子来说明如何
用注册表读取和保存程序的配置信息。
下面这个例子从HKEY_LOCAL_MACHINE\\Software\\MyInfo键下读取配置信息,如果程序
是第一次运行则建立这个键。(使用TRegistry类,需要包含Registry.hpp)
#include <Registry.hpp>

void __fastcall ReadConfig ()
{
TRegistry * reg = new TRegistry();
reg->RootKey = HKEY_LOCAL_MACHINE;
if ( reg->OpenKey ( "\\Software\\MyInfo", true ) )
{//打开HKEY_LOCAL_MACHINE\\Software\\MyInfo键如果不存在则创建
if ( reg->ValueExists ( "DataPath" ) )
{//判断是否存在DataPath这个数据项,存在则读取
SysConfig.DataPath = reg->ReadString ( "DataPath" );
}else{//如果不存在这个数据项则采用程序默认路径
SysConfig.DataPath = DefaultPath;
}
}
reg->CloseKey();//关闭打开的键。
delete reg;
}
下面这个例子是保存信息到注册表,如果不存在这个键则创建并保存。
void __fastcall SaveConfig ()
{
TRegistry * reg = new TRegistry();
reg->RootKey = HKEY_LOCAL_MACHINE;
if ( reg->OpenKey ( "\\Software\\MyInfo", true ) )
{//打开HKEY_LOCAL_MACHINE\\Software\\MyInfo键如果不存在则创建
reg->WriteString ( "DataPath", SysConfig.DataPath );
}
reg->CloseKey();//关闭打开的键并保存信息
delete reg;
}
这两个例子很简单,其它的一些读写方法也和读取和写入String差不多,大家可以试试。

使用注册表要注意的问题。

使用注册表保存配置信息是多数软件所采用的方法,用注册表的优点是用户轻易不
能够取得和修改这些配置信息,能够有一定的安全性和隐蔽性,如果你采用二进制方式
写入的话,用户将很难知道你保存的数据内容,这样可以使你的数据更安全它的缺点就
是你要注意在Windows的不同版本下,注册表的结构是不同的,而且在NT和WIN2000下,
如果权限不够有些键系统是不允许你访问的。再就是用户很讨厌软件在它的注册表里写
入一些东西。这也就是流行的绿色软件之说了。
二、使用INI配置文件

在BCB中有个TIniFile类,它提供了对INI文件的操作,INI文件一种通用的配置文件格式
它也象注册表一样分键和数据项,下面是一个INI配置文件的内容,它有一个键LastConfig,
在这个键下有一个数据项DefaultDit,在数据项后面就是这个数据项的值。
[LastConfig]
DefaultDir=E:\王乐东程序\Sjgl第三版
TIniFile类有几个常用的方法给大家介绍一下:
__fastcall TIniFile(const AnsiString FileName) : Inifiles::TCustomIniFile(FileName) { }
这个方法创建一个INI对象,如果FileName指定的文件名不存在则自动生成此文件,
FileName可以用全路径,指定INI文件的地点,如果只有文件名没有路径,这个函数将到Windows
系统路径下去打开或创建。(WIN9X是Windows目录,NT和2000是WINNT目录)
bool __fastcall SectionExists(const AnsiString Section);
这个方法判断是否存在Section这个键。
virtual AnsiString __fastcall ReadString(const AnsiString Section, const AnsiString Ident, const AnsiString Default);
这个方法从INI文件中读取一个字符串,Section是指定的键,Ident是指定键下的数据项
Default是如果这个项不存在的时候的默认值。
virtual void __fastcall WriteString(const AnsiString Section, const AnsiString Ident, const AnsiString Value);
这个方法是向INI文件中写入一个字符串,Senction是指定的键,Ident是指定的数据项,
Value是要写入的数据。
同TRegistry一样,TIniFile类还提供了读取整型、布尔型,二进制等数据类型的读写方法,
大家看看联机帮助就可以了,用法基本一样。下面就那上面的INI文件为例来说明一下如何
有INI文件来保存配置信息和如何从INI文件中读取数据。

下面的例子是如何从一个INI文件中读取配置,此配置文件保存在应用程序的目录下,如果
没有配置,则取程序所在路径为默认值。

#include <inifiles.hpp>

void __fastcall ReadConfig ()
{//读取配置,
TIniFile * regKey;
AnsiString ExePath = ExtractFileName( ParamStr ( 0 ) );
regKey = new TIniFile ( ExePath + "TrimTxt.ini");
DefaultDir = regKey->ReadString ( "LastConfig", "DefaultDir" , ExePath );
delete regKey;
}

下面的例子说明如何将信息写入INI文件

void __fastcall SaveConfig ()
{
TIniFile * regKey;
AnsiString ExePath = ExtractFileName( ParamStr ( 0 ) );
regKey = new TIniFile ( ExePath + "TrimTxt.ini");
regKey->WriteString ( "LastConfig", "DefaultDir" , DefaultDir );
delete regKey;
}

使用INI文件保存配置信息是很方便的,它最大的优点就是用户可以手工去就改它,它通常
用来保存一些不是至关重要的数据。它的缺点就是不适合保存结构比较复杂的数据,而且文件
容易被破坏。

三、使用文件
使用文件来保存程序的配置,大概是现在不常用到的方法。因为对文件的操作是让很多
初学头疼的事,但通过适当的方法,用文件保存数据还是非常方便和灵活的。
在BCB中使用文件常用的有如下几种方式。
A、用fopen,fwrite比较传统,但比较灵活。
B、使用Stream,如FileStream和MemoryStream,优点是比较方便。
使用文件保存数据我常用的是通过定义一个结构来进行,操作,如以下的结构

struct {
char UserName[10];//用户名
char PassWord[16];//用户密码
int Level[24]; //用户权限
}UserInfo;

这个结构用来保存程序使用者的一些信息,(我随便定义的不一定合理,只是作个例子)
如果用注册表和INI文件来保存都很麻烦,可是如果用文件就很简单了。下面我分别用A、B两
种方式来保存和读取。
下面的这两个例子用传统的文件读写方式来读写配置文件

#include <stdio.h>

bool __fastcall ReadConfig ()
{//读取配置文件
FILE * ptr;
AnsiString FileName = ExtractFileName( ParamStr ( 0 ) ) + "UserInfo.Dat";
ptr = fopen ( FileName.c_str(), "rb" );
if ( ptr == NULL )
{
ShowMessage ( "文件打开失败!" );
return false;
}
fseek ( ptr, 0L, SEEK_END );//定位到文件尾
if ( ftell ( ptr ) != sizeof ( UserInfo ) )
{//判断文件是否被破坏。
ShowMessage ( "配置文件被破坏!" );
fclose ( ptr );
reutrn false;
}
fseek ( ptr, 0L, SEEK_SET );//定位到文件头
fread ( &UserInfo, sizeof ( UserInfo ), 1, ptr );//读取内容到结构。
fclose ( ptr );
return true;
}

void __fastcall SaveConfig()
{
FILE * ptr;
AnsiString FileName = ExtractFileName( ParamStr ( 0 ) ) + "UserInfo.Dat";
ptr = fopen ( FileName.c_str(), "wb" );
if ( ptr == NULL )
{
ShowMessage ( "文件打开失败!" );
return false;
}
fwrite ( &UserInfo, sizeof ( UserInfo ), 1, ptr );//读取内容到结构。
fclose ( ptr );
}
这样就完成了一个配置文件的读写。下面在用Stream来处理这个文件。

bool __fastcall ReadConfig ()
{//用流来读取,我用内存流是因为我的个人习惯,其实用文件流也是一样的。
TMemoryStream * readStream = new TMemoryStream ();
AnsiString FileName = ExtractFileName( ParamStr ( 0 ) ) + "UserInfo.Dat";
readStream->LoadFromFile ( FileName );
if ( readStream->Size != sizeof ( UserInfo ) )
{
ShowMessage ( "配置文件被破坏!" );
delete readStream;
reutrn false;
}
readStream->Seek ( 0, soFromBeginning );//定位到文件头
readStream->ReadBuffer ( &UserInfo, sizeof ( UserInfo ) );//读取文件内容到结构
delete readStream;
}

void __fastcall SaveConfig ()
{
TMemoryStream * readStream = new TMemoryStream ();
AnsiString FileName = ExtractFileName( ParamStr ( 0 ) ) + "UserInfo.Dat";
readStream->WriteBuffer ( &UserInfo, sizeof ( UserInfo ) );//将结构写入流
readStream->Seek ( 0, soFromBeginning );//定位到头
readStream->SaveToFile ( FileName );
delete readStream;
}
这样完成了用流来读写数据,通过对这两种方法的比较,用流方便一些。
用文件来保存数据的缺点就是有些繁琐,而且文件容易被删除,但它的优点就可以保存
大量、复杂的数据,这时使用注册表和INI文件所无法完成的。

以上的三种配置文件的就我的个人观点来看,如果不是要求安全,用文件是最好的,它
最灵活,而且可以快速的读取和写入。这也是我最长使用的方法。当然了使用注册表和INI
文件也可以完成要求,一切就看你的喜好了。

分享到:
评论

相关推荐

    DEVC++5.11版本安装包

    5. **配置文件**:DEVC++的设置和项目模板可能保存在cfg目录下,这些配置文件帮助IDE根据用户偏好进行定制。 6. **帮助文档**:有时DEVC++会附带一些帮助文档,如PDF或HTML格式,供用户参考学习。 安装DEVC++5.11的...

    Dev c++ 基本使用和配置

    Dev C++是一款轻量级的集成开发环境(IDE),专为C和C++编程语言设计。它包含了GCC编译器,提供了一个简洁的用户界面,适合初学者学习编程。以下是一份详细的Dev C++基本使用和配置教程: 1. **安装Dev C++** - ...

    Dev-C++5.10下载

    7. **多语言支持**:虽然主要面向C++,但通过插件和配置,Dev-C++也可以支持其他编程语言,如C或汇编。 8. **教学友好**:对于学习C++的初学者,Dev-C++提供了易于理解的界面和操作流程,便于学习编程基础。 9. **...

    devC++自制RPG游戏-菇蛹者1.0

    【标题】"devC++自制RPG游戏-菇蛹者1.0" 是一个使用C++编程语言在devC++开发环境下创建的角色扮演游戏。RPG(Role-Playing Game)游戏通常涉及玩家扮演虚拟世界中的角色,进行探索、交互、战斗等行动。在这款游戏中...

    dev c++ 好看的风格monokai【附安装步骤】

    3. **配置Dev C++**: 打开Dev C++,进入"工具"菜单,选择"设置",然后在弹出的"设置"对话框中点击"全局"选项卡。在这里,你会看到"代码样式"的选项。 4. **导入Monokai主题**: 在"代码样式"下拉菜单中,选择"导入...

    Dev C++的OpenGL库文件及头文件

    在Dev C++这样的集成开发环境中,为了使用OpenGL进行编程,我们需要配置相应的库文件和头文件。本篇文章将详细讲解如何在Dev C++中设置OpenGL库和头文件,以及提供的范例。 首先,`gl`, `glu`, `glut`, `glert`, 和...

    C语言编程软件Dev-Cpp

    Dev-Cpp是一款专为C语言编程设计的集成开发环境(IDE),它以其简洁的界面和易用性赢得了初学者和专业开发者的喜爱。这个软件提供了一个全面的开发环境,包括编辑器、编译器、链接器以及调试器,使得C语言的程序编写...

    DEV5.0中文版C++编译软件

    - 新建项目:启动DEV C++,选择“文件”&gt;“新建”&gt;“项目”,设定项目名称和保存位置。 - 编写代码:在打开的源代码文件中编写C++代码。 - 编译与运行:点击“构建”按钮编译代码,若无错误,点击“运行”按钮...

    Dev-C++安装包(5.11版本)-windows

    **Dev-C++ 5.11 版本安装指南** Dev-C++ 是一款轻量级的...通过使用Dev-C++ 5.11,初学者能够轻松地学习和实践C/C++编程,而无需复杂的配置。随着对编程的理解加深,你还可以探索更多高级功能,进一步提升编程效率。

    opengl开发库(dev cpp)

    5. 编译与运行:保存代码后,使用Dev C++的编译和运行功能,检查是否有错误或警告,如果没有,就可以看到OpenGL程序的效果了。 在现代OpenGL编程中,Glaux库已经逐渐被淘汰,因为它的功能已被其他库(如GLEW和GLFW...

    dev c++多国语言版5.0

    学习C语言时,使用Dev C++可以让你专注于编程本身,而不需要过多关注环境配置等复杂问题。通过创建新项目,添加源文件,然后编写、运行和调试代码,你可以逐步掌握C语言的基础和高级概念。 例如,你可以通过以下...

    Dev-Cpp 5.11版本(Dev-c++)安装包

    值得注意的是,安装说明文件"dev安装配置.txt"可能包含了一些额外的安装步骤或配置建议,比如如何设置环境变量,或者解决可能出现的问题,用户在安装过程中应该仔细阅读并按照指示操作。 Dev-Cpp 5.11 的主要特点...

    C++编译器(DEV)

    **C++编译器的重要性** C++是一种广泛使用的高级编程语言,它以其高效性、灵活性和面向对象特性而闻名。为了将C++源代码转换为可执行...无论你是编程新手还是有一定经验的开发者,都值得尝试这款优秀的C++开发工具。

    Dev-cpp5.4.0官方下载 及 API帮助文档

    - **轻量级**:相比于其他大型IDE,Dev-Cpp占用资源少,启动速度快,对计算机配置要求较低。 - **易于上手**:界面简洁,布局清晰,适合编程初学者快速熟悉和使用。 - **集成编译器**:内置了MinGW编译器,支持...

    Dev C++软件安装包

    Dev C++是一款专门为初学者设计的C和C++编程环境,它的主要特点是小巧、易用且功能齐全。这款软件在编程教育领域广受欢迎,尤其适合那些刚刚接触编程的初学者。下面将详细介绍Dev C++的各个方面,以及如何进行安装。...

    Dev-Cpp资源安装包

    Dev-Cpp是一个集成开发环境(IDE),专为C++编程设计。这个资源安装包的目的是为了简化用户下载和配置C++编程环境的过程。在本文中,我们将深入探讨Dev-Cpp的特点、功能,以及如何利用它进行C++编程。 Dev-Cpp是由...

    dev c++ 连接 mysql 方法、库

    5. **编译和运行**:最后,保存代码并在Dev C++中编译和运行。如果配置正确,程序应该能够成功连接到MySQL数据库并执行查询。 以上就是使用Dev C++连接MySQL数据库的基本流程。在实际项目中,你可能还需要处理错误...

    Dev C++ --精简版,汉化版

    1. **轻量级**:相比于其他大型IDE,如Visual Studio,Dev C++的安装包小,占用系统资源少,启动速度快,适合配置较低的计算机。 2. **用户友好**:其界面简洁,功能布局直观,对于初学者来说容易上手。 3. **集成...

    devcpp_5.11.0_XiaZaiBa.zip

    - **轻量级**:相比其他大型 IDE,Dev-C++ 的安装包小,占用系统资源少,启动快速,适合配置较低的计算机。 - **多语言支持**:主要支持 C 和 C++,但也可以通过插件扩展到其他编程语言。 - **报错准确**:使用 ...

    DEV Cpp多国语言版

    **DEV Cpp 多国语言版** DEV Cpp是一款经典的集成...总的来说,DEV Cpp多国语言版为C++编程提供了便利的环境,无论你是新手还是经验丰富的开发者,都能从中受益。通过熟悉其各项功能,你可以更高效地进行C++程序开发。

Global site tag (gtag.js) - Google Analytics