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

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

我的編程經(jīng)驗之一如何保存配置信息

2019-09-10 09:07:01
字體:
供稿:網(wǎng)友

 

我的編程經(jīng)驗之一 程序配置信息的保存

   在我們編寫的每一個程序中,我們都要保存一些有用的信息,如何保存這些信息呢?
比較常用的有三種方法,一種是使用注冊表,一種是使用Ini文件,還有就是使用文件。
   采用那種方法保存配置信息,不同的人可能有不同的習慣,這三種方法那種最適合你
的程序呢,究竟那個最方便呢?
一、使用注冊表
   在BCB中有個TRegistry,它提供了方便的注冊表操作,它有幾個重要的屬性和方法。
如下:
   __property HKEY RootKey = {read=FRootKey, write=SetRootKey, nodefault};
   這個屬性用來設(shè)置和取得當前的根鍵。在默認情況下它的值是HKEY_CURRENT_USER。
   這個屬性是我們常常用到的。
   bool __fastcall OpenKey(const AnsiString Key, bool CanCreate);
   這個方法用來打開一個鍵,bool CanCreate是表示如果這個鍵不存在則是否創(chuàng)建這個
   鍵,true是創(chuàng)建。如果打開成功返回true。
   void __fastcall CloseKey(void);
   這個方法關(guān)閉當前打開的鍵,當你完成注冊表的修改后,應(yīng)該調(diào)用此方法來保存您的
   修改。
   bool __fastcall KeyExists(const AnsiString Key);
   這個方法判斷一個鍵是否存在。
   bool __fastcall ValueExists(const AnsiString Name);
   這個方法判斷當前鍵下是否存在指定的數(shù)據(jù)項。
   AnsiString __fastcall ReadString(const AnsiString Name);
   這個方法從當前鍵下指定的數(shù)據(jù)項讀取一個字符串。
   void __fastcall WriteString(const AnsiString Name, const AnsiString Value);
   這個方法向當前鍵下指定的數(shù)據(jù)項寫入一個字符串。類似的函數(shù)還有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鍵如果不存在則創(chuàng)建
       if ( reg->ValueExists ( "DataPath" ) )
       {//判斷是否存在DataPath這個數(shù)據(jù)項,存在則讀取
/t  SysConfig.DataPath = reg->ReadString ( "DataPath" );
       }else{//如果不存在這個數(shù)據(jù)項則采用程序默認路徑
/t  SysConfig.DataPath = DefaultPath;
       }
     }
     reg->CloseKey();//關(guān)閉打開的鍵。
     delete reg;
   }
   下面這個例子是保存信息到注冊表,如果不存在這個鍵則創(chuàng)建并保存。
   void __fastcall SaveConfig ()
   {
     TRegistry * reg = new TRegistry();
     reg->RootKey = HKEY_LOCAL_MACHINE;
     if ( reg->OpenKey ( "/Software/MyInfo", true  ) )
     {//打開HKEY_LOCAL_MACHINE/Software/MyInfo鍵如果不存在則創(chuàng)建
       reg->WriteString ( "DataPath", SysConfig.DataPath );
     }
     reg->CloseKey();//關(guān)閉打開的鍵并保存信息
     delete reg;
   }
   這兩個例子很簡單,其它的一些讀寫方法也和讀取和寫入String差不多,大家可以試試。

   使用注冊表要注意的問題。

       使用注冊表保存配置信息是多數(shù)軟件所采用的方法,用注冊表的優(yōu)點是用戶輕易不
   能夠取得和修改這些配置信息,能夠有一定的安全性和隱蔽性,如果你采用二進制方式
   寫入的話,用戶將很難知道你保存的數(shù)據(jù)內(nèi)容,這樣可以使你的數(shù)據(jù)更安全它的缺點就
   是你要注意在Windows的不同版本下,注冊表的結(jié)構(gòu)是不同的,而且在NT和WIN2000下,
   如果權(quán)限不夠有些鍵系統(tǒng)是不允許你訪問的。再就是用戶很討厭軟件在它的注冊表里寫
   入一些東西。這也就是流行的綠色軟件之說了。
二、使用INI配置文件

   在BCB中有個TIniFile類,它提供了對INI文件的操作,INI文件一種通用的配置文件格式
它也象注冊表一樣分鍵和數(shù)據(jù)項,下面是一個INI配置文件的內(nèi)容,它有一個鍵LastConfig,
在這個鍵下有一個數(shù)據(jù)項DefaultDit,在數(shù)據(jù)項后面就是這個數(shù)據(jù)項的值。
 [LastConfig]
 DefaultDir=E:王樂東程序Sjgl第三版
 TIniFile類有幾個常用的方法給大家介紹一下:
 __fastcall TIniFile(const AnsiString FileName) : Inifiles::TCustomIniFile(FileName) { }
 這個方法創(chuàng)建一個INI對象,如果FileName指定的文件名不存在則自動生成此文件,
 FileName可以用全路徑,指定INI文件的地點,如果只有文件名沒有路徑,這個函數(shù)將到Windows
 系統(tǒng)路徑下去打開或創(chuàng)建。(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是指定鍵下的數(shù)據(jù)項
 Default是如果這個項不存在的時候的默認值。
 virtual void __fastcall WriteString(const AnsiString Section, const AnsiString Ident, const AnsiString Value);
 這個方法是向INI文件中寫入一個字符串,Senction是指定的鍵,Ident是指定的數(shù)據(jù)項,
 Value是要寫入的數(shù)據(jù)。
 同TRegistry一樣,TIniFile類還提供了讀取整型、布爾型,二進制等數(shù)據(jù)類型的讀寫方法,
 大家看看聯(lián)機幫助就可以了,用法基本一樣。下面就那上面的INI文件為例來說明一下如何
 有INI文件來保存配置信息和如何從INI文件中讀取數(shù)據(jù)。

 下面的例子是如何從一個INI文件中讀取配置,此配置文件保存在應(yīng)用程序的目錄下,如果
 沒有配置,則取程序所在路徑為默認值。

 #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文件保存配置信息是很方便的,它最大的優(yōu)點就是用戶可以手工去就改它,它通常
用來保存一些不是至關(guān)重要的數(shù)據(jù)。它的缺點就是不適合保存結(jié)構(gòu)比較復雜的數(shù)據(jù),而且文件
容易被破壞。

三、使用文件
   使用文件來保存程序的配置,大概是現(xiàn)在不常用到的方法。因為對文件的操作是讓很多
初學頭疼的事,但通過適當?shù)姆椒ǎ梦募4鏀?shù)據(jù)還是非常方便和靈活的。
   在BCB中使用文件常用的有如下幾種方式。
   A、用fopen,fwrite比較傳統(tǒng),但比較靈活。
   B、使用Stream,如FileStream和MemoryStream,優(yōu)點是比較方便。
   使用文件保存數(shù)據(jù)我常用的是通過定義一個結(jié)構(gòu)來進行,操作,如以下的結(jié)構(gòu)

   struct {
     char      UserName[10];//用戶名
     char      PassWord[16];//用戶密碼
     int       Level[24];   //用戶權(quán)限
   }UserInfo;

   這個結(jié)構(gòu)用來保存程序使用者的一些信息,(我隨便定義的不一定合理,只是作個例子)
如果用注冊表和INI文件來保存都很麻煩,可是如果用文件就很簡單了。下面我分別用A、B兩
種方式來保存和讀取。
   下面的這兩個例子用傳統(tǒng)的文件讀寫方式來讀寫配置文件

   #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 );//讀取內(nèi)容到結(jié)構(gòu)。
     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 );//讀取內(nèi)容到結(jié)構(gòu)。
     fclose ( ptr );
   }
   這樣就完成了一個配置文件的讀寫。下面在用Stream來處理這個文件。

   bool __fastcall ReadConfig ()
   {//用流來讀取,我用內(nèi)存流是因為我的個人習慣,其實用文件流也是一樣的。
     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 ) );//讀取文件內(nèi)容到結(jié)構(gòu)
     delete readStream;
   }

   void __fastcall SaveConfig ()
   {
     TMemoryStream * readStream = new TMemoryStream ();
     AnsiString FileName = ExtractFileName( ParamStr ( 0 ) ) + "UserInfo.Dat";
     readStream->WriteBuffer ( &UserInfo, sizeof ( UserInfo ) );//將結(jié)構(gòu)寫入流
     readStream->Seek ( 0, soFromBeginning );//定位到頭
     readStream->SaveToFile ( FileName );
     delete readStream;
   }
   這樣完成了用流來讀寫數(shù)據(jù),通過對這兩種方法的比較,用流方便一些。
   用文件來保存數(shù)據(jù)的缺點就是有些繁瑣,而且文件容易被刪除,但它的優(yōu)點就可以保存
大量、復雜的數(shù)據(jù),這時使用注冊表和INI文件所無法完成的。

   以上的三種配置文件的就我的個人觀點來看,如果不是要求安全,用文件是最好的,它
最靈活,而且可以快速的讀取和寫入。這也是我最長使用的方法。當然了使用注冊表和INI
文件也可以完成要求,一切就看你的喜好了。

 

上一篇:返回列表

下一篇:輕輕松松學STL

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

圖片精選

在线视频您懂的| 性生活免费观看视频| 视频三区在线观看| 交视频在线观看国产| 精品国产伦一区二区三区免费| 日本sm残虐另类| 精品国产人成亚洲区| www.一区二区三区| 成人高清av| 日韩一区二区三| 51精品视频| 国产日韩高清一区二区三区在线| 亚洲AV无码一区二区三区性| 久久久久久久国产| 国产精品黄网站| 国产波霸爆乳一区二区| 欧美国产极品| 亚洲精选一区二区三区| 日韩成人高清| 成人精品视频在线播放| 国产精品一区二区三区在线播放| 3p乱日视频| 国产精品美女久久久久人| 国产在线播放精品| 草久久免费视频| 亚洲娇小xxxx欧美娇小| 亚洲精品推荐| 精品成人国产| 亚洲奶汁xxxx哺乳期| 亚洲第一网站免费视频| 午夜欧美精品久久久久久久| 激情中国色综合| 在线国产精品网| 国产成人精品片| 精品樱空桃一区二区三区| 97精品在线播放| 免费观看成年在线视频网站| 日韩av在线播| av在线小说| 成人18免费| 女人被男人躁得好爽免费视频| 91丨九色丨海角社区| 久久综合五月| 亚洲精品国产精| 国产裸体永久免费无遮挡| 亚洲精品天堂网| 亚洲一区二区中文| 伦xxxx在线| chinese麻豆新拍video| 69堂成人精品免费视频| a级黄色片免费| 日韩欧美专区| 蜜桃精品久久久久久久免费影院| 日韩三级电影| 99久久婷婷国产一区二区三区| 亚洲第一精品在线| 九九热在线视频观看这里只有精品| 久久久精品免费看| 日韩亚洲欧美中文在线| 亚洲同性同志一二三专区| 色噜噜狠狠狠综合曰曰曰88av| 欧美激情视频在线观看| 亚洲精品人成网在线播放影院| 韩国av永久免费| 国产精品字幕| 国产精品久久久免费| 日本免费三片免费观看| 国产无遮挡又黄又爽免费网站| 欧美尤物美女在线| 国产日韩另类视频一区| 先锋影音av资源网| 成人午夜av影视| 久久99精品久久久久久国产越南| 久久午夜a级毛片| 欧美精品一区二区三区视频| 亚洲一区不卡| 亚洲女人天堂视频| 日韩欧美视频在线免费观看| 国产精品视频| 中文在线第一页| 久久综合一区二区三区| 一级片黄色录像| 视频在线日韩| 日本a√在线观看| 成人精品一二三区| 冲田杏梨av在线| 久久亚洲国产成人精品无码区| 亚洲精品无码久久久| 日本女优天堂99伊人| av电影一区| 久久精品影视大全| jjzzjjzz欧美69巨大| 一区二区三区视频在线| 国产精品九九九九九| 欧美区二区三区| 性色av一区二区怡红| 国产精品v欧美精品v日韩精品| 欧美日韩黄色网| 欧美做受xxxxxⅹ性视频| 日本天堂一区| 免费一区二区三区视频狠狠| 亚洲第一狼人社区| 欧美国产日本韩| 免费看欧美一级片| 日韩 欧美 高清| 向日葵污视频在线观看| 国产精品天天干| 欧美精品与人动性物交免费看| 中国一级大黄大黄大色毛片| 国产精品黑丝在线播放| 欧洲成人午夜精品无码区久久| 99精品视频免费观看| 欧美大片高清| 欧美巨大xxxx| 在线色欧美三级视频| www.91av.com| 一起草在线视频| 久热精品视频在线观看一区| 亚洲精品菠萝久久久久久久| 成人国产精品一区二区网站| 6080亚洲理论片在线观看| 日韩视频一区二区三区在线播放免费观看| baoyu777.永久免费视频| 精品熟妇无码av免费久久| 久久精品av麻豆的观看方式| 欧洲精品久久久久毛片完整版| 成人精品高清在线视频| 日韩一级精品视频在线观看| 欧美精品一区二区蜜桃| 天天爽夜夜爽视频| 欧美做受69| 成人听书哪个软件好| 欧美成人bangbros| 亚洲激情第一区| 四虎影视最新网站入口在线观看| 亚洲人成网站77777在线观看| 国产精品-区区久久久狼| 国产91高潮流白浆在线麻豆| 欧美成人免费全部网站| 亚洲福利影视| 日本美女xxx| 日韩欧美一级特黄在线播放| 97超碰资源站在线观看| 青青草国产一区二区三区| 狠狠鲁狠狠操| 亚洲天堂一级片| 中文字幕在线精品| 国内老司机av在线| 无套内谢大学处破女www小说| 国产精品视频专区| 欧美日韩国产一级二级| 成年人黄视频网站| 亚洲v日本v欧美v久久精品| 丝瓜app色版网站观看| 综合久久99| 极品美女销魂一区二区三区免费| heyzo高清国产精品| 亚洲精品免费在线观看| 高h放荡受浪受bl| 精品在线视频观看| 欧美一级一区二区三区| a级大胆欧美人体大胆666| 777午夜精品电影免费看| 男人亚洲天堂| 五月婷婷在线观看| 在线观看a视频| 污视频在线观看免费| 成人在线中文| 国产成人超碰人人澡人人澡| 黑人精品一区二区三区| 99自拍偷拍视频| √天堂资源地址在线官网| 国内精品免费| 久久电影一区二区| 麻豆一区二区三区精品视频| 成人动漫h在线观看| 亚洲第一精品影视| 欧美日韩国产精品一区二区三区| 能免费看av的网站| 亚洲高清资源综合久久精品| 日本黄色精品| 亚洲精品国产无套在线观| 日韩av午夜在线观看| 欧美日本在线视频| 国产高清不卡一区| 国产精品一二三区视频| 国产日韩欧美中文在线播放| 国产成人综合欧美精品久久| 国产ktv在线视频| 色香蕉在线观看| 啦啦啦在线视频免费观看高清中文| 美脚丝袜脚交一区二区| 国产精品熟女一区二区不卡| 香蕉视频久久久| 国产精品久久久久久久久毛片| 国内精品免费一区二区三区| 色网站在线播放| 日本一区免费在线观看| 色噜噜狠狠色综合中国| 久久国产中文字幕| 国产亚洲激情视频在线| 国产xxxx在线观看| 国产精品一区二区女厕厕| 久久久久久蜜桃一区二区| 一本一道无码中文字幕精品热| 日本一区二区久久精品| 精品va天堂亚洲国产| 99久久亚洲国产日韩美女| 日韩午夜精品电影| 先锋a资源在线看亚洲| 国产欧美精品区一区二区三区| 极品尤物一区| 一区二区三区电影| 中文字幕一区二| 91日韩免费| 久久久久久久久国产精品| 亚洲国产日韩欧美在线观看| 污影院在线观看| 亚洲成在人线免费观看| 日韩不卡在线| 欧美一级在线观看| 素人av在线| 国产麻豆一区二区三区精品| 国产91绿帽单男绿奴| www国产精品av| jizz中文字幕| 麻豆影视在线播放| 视频在线观看免费影院欧美meiju| 亚洲一区中文在线| 男女男精品网站| 日韩理论片一区二区| 久久99视频精品| 香蕉伊大人中文在线观看| 亚洲在线资源| 日韩三级一区二区三区| 久久福利在线| 久久中文娱乐网| 午夜免费福利在线观看| 懂色av一区二区三区免费看| 婷婷中文字幕在线观看| 日韩亚洲视频在线| 丰满少妇在线观看资源站| 亚洲精品一区二区三区在线| 樱花影视一区二区| 国模gogo一区二区大胆私拍| 欧美在线视频你懂得| 9.1人成人免费视频网站| 久久精品99久久久| 大色综合视频网站在线播放| 成人免费黄色在线| 天天干天天操av| 亚洲精品欧美一区二区三区| 成人在线看片网站| 精品国产第一国产综合精品| 亚洲字幕成人中文在线观看| 电影一区二区三区久久免费观看| 欧美黑人一级爽快片淫片高清| 佐佐木明希电影| 国产丝袜护土调教在线视频| 一区福利视频| 秋霞蜜臀av久久电影网免费| 亚洲国产另类精品专区| 成人动漫视频在线| av网址在线免费观看| 99精品人妻无码专区在线视频区| 裸体武打性艳史| 野战少妇38p| 久久精品国产96久久久香蕉| 精品推荐国产麻豆剧传媒| 黄视频网站在线观看| 日本丰满少妇xxxx| 中文字幕国产专区| 国产调教打屁股xxxx网站| 亚洲精品国产精品乱码| gogo久久日韩裸体艺术| 精品日韩美女的视频高清| 国精产品一区一区三区mba下载| 嫩草影院入口一二三| 顶级嫩模一区二区三区| 亚洲国产成人va在线观看天堂| 不卡的av电影在线观看| 鲁大师成人一区二区三区| 最近看过的日韩成人| 日韩久久免费av| 在线国产电影不卡| 日韩欧美国产中文字幕| 在线观看国产91| 日本免费无人高清| 爱情岛论坛亚洲自拍| 国产一区二区精品久| 一个人www视频在线免费观看| 中文字幕第5页| 99久久精品免费看国产| 粗大黑人巨茎大战欧美成人| 在线手机福利影院| 亚洲精品在线观看网站| 亚洲国产视频网站| 成人动漫在线观看视频| 国产av熟女一区二区三区| 蜜桃色永久入口| 国产一区二区视频在线观看| 浮力影院网站午夜| 黄网站在线观看高清免费| 伊人色综合久久| 狠狠热免费视频| 在线免费观看a视频| 中文高清一区| 欧美人与禽zozo性伦| 亚洲国产精品女人久久久| 欧美丰满熟妇xxxxx| 综合在线视频| 97在线观看| 欧美特黄aaa| 欧美成人午夜77777| 国产超碰在线一区| 亚洲大胆人体大胆做受1| 日韩成人精品视频| av片在线免费看| 高潮毛片在线观看| 欧美成人免费全部观看天天性色| 99免在线观看免费视频高清| 18岁以下禁止观看的美女视频| 国产福利免费观看| 特大巨黑人吊性xxxxn38| 影音先锋中文字幕在线观看| 欧美日韩在线视频首页| 日本影音先锋电影| 日韩免费在线电影|