当前位置:天才代写 > tutorial > C语言/C++ 教程 > 措施设置信息的生存

措施设置信息的生存

2017-11-04 08:00 星期六 所属: C语言/C++ 教程 浏览:393

副标题#e#

在我们编写的每一个措施中,我们都要生存一些有用的信息,如何生存这些信息呢?较量常用的有三种要领,一种是利用注册表,一种是利用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);


#p#副标题#e#

这个要领向当前键下指定的数据项写入一个字符串。雷同的函数尚有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下,假如权限不足有些键系统是不答允你会见的。再就是用户很讨厌软件在它的注册内外写

入一些对象。这也就是风行

#p#副标题#e#

二、利用INI设置文件

的绿色软件之说了。

 

在BCB中有个TIniFile类,它提供了对INI文件的操纵,INI文件一种通用的设置文件名目它也象注册表一样分键和数据项,下面是一个INI设置文件的内容,它有一个键LastConfig,在这个键下有一个数据项DefaultDit,在数据项后头就是这个数据项的值。

[LastConfig]

DefaultDir=E:\xxx

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);

#p#分页标题#e#

这个要领是向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文件生存设置信息是很利便的,它最大的利益就是用户可以手工去就改它,它凡是用来生存一些不是至关重要的数据。它的缺点就是不适合生存布局较量巨大的数据,并且文件容易被粉碎。

#p#副标题#e#

三、利用文件

利用文件来生存措施的设置,或许是此刻不常用到的要领。因为对文件的操纵是让许多初学头疼的事,但通过适当的要领,用文件生存数据还长短常利便和机动的。

在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);
}

#p#副标题#e#

这样就完成了一个设置文件的读写。下面在用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;
}

#p#分页标题#e#

这样完成了用流来读写数据,通过对这两种要领的较量,用流利便一些。用文件来生存数据的缺点就是有些繁琐,并且文件容易被删除,但它的利益就可以生存大量、巨大的数据,这时利用注册表和INI文件所无法完成的。

以上的三种设置文件的就我的小我私家概念来看,假如不是要求安详,用文件是最好的,它最机动,并且可以快速的读取和写入。这也是我最长利用的要领。虽然了利用注册表和INI文件也可以完成要求,一切就看你的爱好了。

 

    关键字:

天才代写-代写联系方式