亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

我的編程經驗之一如何保存配置信息

2019-09-10 09:07:01
字體:
來源:轉載
供稿:網友

 

我的編程經驗之一 程序配置信息的保存

   在我們編寫的每一個程序中,我們都要保存一些有用的信息,如何保存這些信息呢?
比較常用的有三種方法,一種是使用注冊表,一種是使用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這個數據項,存在則讀取
/t  SysConfig.DataPath = reg->ReadString ( "DataPath" );
       }else{//如果不存在這個數據項則采用程序默認路徑
/t  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 ( "文件打開失?。?quot; );
       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
文件也可以完成要求,一切就看你的喜好了。

 

上一篇:返回列表

下一篇:輕輕松松學STL

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品88a∨| 91在线视频免费| 91国自产精品中文字幕亚洲| 国产一区二区三区精品久久久| 欧美色欧美亚洲高清在线视频| 久久视频在线看| 欧美一区二粉嫩精品国产一线天| 日韩福利视频在线观看| 亚洲最大成人免费视频| 国产91精品久久久| 热久久免费视频精品| 欧美国产视频一区二区| 亚洲国产欧美一区二区丝袜黑人| 国产精品久久久久久久午夜| 国产精品久久在线观看| 亚洲国产精品久久久久秋霞不卡| 亚洲国产精品久久久久秋霞蜜臀| 久久久久久国产三级电影| 日本成人免费在线| 久久精品电影一区二区| 成人黄色生活片| 欧美性xxxxxxxxx| 亚洲欧美日韩视频一区| 久久激情五月丁香伊人| 欧美在线视频免费观看| 国产精品电影网| 久久久免费高清电视剧观看| 亚洲欧美精品在线| 欧美在线视频免费观看| 日韩成人激情影院| 97精品国产91久久久久久| 亚洲最大福利网站| 日韩中文字幕网| 草民午夜欧美限制a级福利片| 欧美在线视频观看免费网站| 日韩精品中文字幕有码专区| 丝袜情趣国产精品| 亚洲国产精品一区二区三区| 一区二区三区在线播放欧美| 精品国产999| 国产精品无av码在线观看| 亚洲iv一区二区三区| 91精品久久久久久久久久久久久久| 亚洲国产精品99久久| 久久久av免费| 国产精品成人一区二区| 日韩精品中文字| 日韩电影中文字幕一区| 国产精品色悠悠| 欧美成人免费网| 欧美一区二区视频97| 亚洲三级黄色在线观看| 亚洲精品国产精品自产a区红杏吧| 成人免费视频网| 国产在线观看精品一区二区三区| 久久久亚洲影院| 91精品国产网站| 亚洲美腿欧美激情另类| 国产精品一区二区性色av| 日韩中文字幕在线精品| 久久99久久亚洲国产| 欧美午夜精品在线| 国产精品日韩在线| 狠狠躁夜夜躁久久躁别揉| 欧美亚洲激情在线| 91老司机精品视频| 日韩最新av在线| 亚洲精品国精品久久99热| 国产精品久久久久久久久久三级| 欧美日韩在线视频首页| 欧美性感美女h网站在线观看免费| 国产精品久久久久99| 欧洲永久精品大片ww免费漫画| 日韩二区三区在线| 3344国产精品免费看| 亚洲精品电影网在线观看| 中文字幕成人在线| 国产精品永久免费观看| 欧洲精品在线视频| 超碰精品一区二区三区乱码| 亚洲欧美国产日韩中文字幕| 91麻豆国产语对白在线观看| 高潮白浆女日韩av免费看| 久久久成人精品视频| 日韩欧美一区视频| 伊人成人开心激情综合网| 亚洲欧美日韩精品久久奇米色影视| 成人午夜激情网| 国产精品揄拍一区二区| 精品无人区乱码1区2区3区在线| 国产精品影院在线观看| 一个人看的www欧美| 亚洲视频在线免费看| 亚洲女人天堂av| 国产综合香蕉五月婷在线| 欧美视频中文在线看| 亚洲无av在线中文字幕| 色无极影院亚洲| 国产中文字幕91| 日本高清不卡在线| 欧美极品少妇与黑人| 97视频在线观看免费| 国产亚洲精品久久久久动| 亚洲免费视频在线观看| 91精品国产91久久久久久吃药| 久久这里只有精品视频首页| 欧美激情在线视频二区| 国内自拍欧美激情| 欧美视频一二三| 国产精品第10页| 欧美成人午夜激情在线| 亚洲精品美女久久久| 国产97在线亚洲| 午夜精品久久久久久99热| 亚洲精品大尺度| 性色av一区二区咪爱| 欧美一级大片在线观看| 精品久久久久久| 欧美性受xxxx黑人猛交| 色爱av美腿丝袜综合粉嫩av| 欧美电影免费观看网站| 午夜免费久久久久| 久久久国产精品亚洲一区| 久久成人这里只有精品| 1769国内精品视频在线播放| 91av在线视频观看| 日韩有码在线观看| 欧美亚洲日本黄色| 国产激情视频一区| 精品久久久久久久久久久久久久| 欧美精品在线第一页| 久久久久久久影院| 日韩精品视频中文在线观看| 日韩中文字幕在线免费观看| 欧美又大粗又爽又黄大片视频| 亚洲色图国产精品| 一个人www欧美| 国产精品久久久久久久美男| 亚洲欧美一区二区三区四区| 国产精品一区二区久久| 日韩精品极品视频免费观看| 日韩精品在线免费观看视频| 日韩大陆欧美高清视频区| 国产精品露脸自拍| 在线视频中文亚洲| 久久久女女女女999久久| 亚洲精选一区二区| 久久精品国产99国产精品澳门| 日韩电影视频免费| 成人精品网站在线观看| 国产精品自产拍在线观看中文| 91精品免费看| 欧美日韩国产中文字幕| 久久99亚洲精品| 91在线免费看网站| 欧美精品videos| 国产成人综合精品在线| 欧美最猛性xxxxx亚洲精品| 国产亚洲xxx| 亚洲欧美精品中文字幕在线| 国产亚洲免费的视频看| 日本久久久久久| 国a精品视频大全| 久久人人爽人人爽人人片av高清|