天天看點

如何在MFC中讀寫配置檔案?

GetPrivateProfileString();   

GetPrivateProfileInt();   

WriteprivateProfileInt(); 讀寫ini 檔案  

CWinApp::GetProfileInt()一類的函數 

或者 

UINT GetPrivateProfileInt( 

LPCTSTR lpAppName, // section name 

LPCTSTR lpKeyName, // key name 

INT nDefault, // return value if key name not found 

LPCTSTR lpFileName // initialization file name 

); 

讀取指定的配置檔案,lpFileName是配置檔案名

DWORD GetPrivateProfileString( 

LPCTSTR lpAppName, // 你定義的段 

LPCTSTR lpKeyName, // 你的鍵名 

LPCTSTR lpDefault, // 沒有鍵值時的預設值 

LPTSTR lpReturnedString, // char buff[xx] 

DWORD nSize, // xxx 

LPCTSTR lpFileName // 配置檔案路徑(完整路徑)   

);   

WritePrivateProfileString:和上面的差不多,如果将 Private 去掉,可以不加路徑(隻寫檔案名),   

函數自動到windows的預設路徑搜尋檔案名  

-----------------------------------------------------------------------------------------------------------------------

給你些提示:自己看看吧: 

建立INI檔案: 

var ini : tinifile; 

ini := tinifile.create('filename.ini'); 

ini.writesring('key','dfj','valre);//如果檔案不存在則建立,存在就打開檔案在裡面寫 

從.INI檔案中擷取字元串 

var 

strResult:pchar; 

begin 

GetPrivateProfileString( 

'windows', // []中标題的名字 

'NullPort', // =号前的名字 

'NIL', // 如果沒有找到字元串時,傳回的預設值 

strResult, //存放取得字元 

100, //取得字元的允許最大長度 

'c:\forwin95\win.ini' // 調用的檔案名 

); 

edit1.text:=strResult; //顯示取得字元串 

從.INI檔案中擷取整數 

edit1.text:=inttostr(GetPrivateProfileInt( 

'intl', // []中标題的名字 

'iCountry', // =号前的名字 

0,// 如果沒有找到整數時,傳回的預設值 

'c:\forwin95\win.ini' // 調用的檔案名 

)); 

向.INI檔案寫入字元串 

WritePrivateProfileString( 

'windows', // []中标題的名字 

'load', // 要寫入“=”号前的字元串 

'accca', //要寫入的資料 

'c:\forwin95\win.ini' // 調用的檔案名 

); 

向.INI檔案寫入整數 

WritePrivateProfileSection( 

'windows', // []中标題的名字 

'read=100', // 要寫入的資料 

'c:\forwin95\win.ini' // 調用的檔案名 

); 

上面的方法是調用API函數,下面介紹另一種不用API從.INI檔案中擷取字元的方法 

var MyIni: TIniFile; 

begin 

MyIni := TIniFile.Create('WIN.INI');//調用的檔案名 

edit1.text:=MyIni.ReadString('Desktop', 'Wallpaper', '');//取得字元 

end; 

向.INI檔案中寫入字元的方法 

var MyIni: TIniFile; 

begin 

MyIni := TIniFile.Create('WIN.INI');//調用的檔案名 

DelphiIni.WriteString('Desktop', 'Wallpaper', 'c:\a.bmp'); 

end; 

增加一條:用完INI檔案後最好将其釋放(MyIni.Free; ) 

關于ini的說明和學習 

=========================== 

一、有必要了解INI檔案的結構: 

;注釋 

[小節名] 

關鍵字=值 

... 

INI檔案允許有多個小節,每個小節又允許有多個關鍵字,“=”後面是該關鍵字的值。 

值的類型有三種:字元串、整型數值和布爾值。其中字元串存貯在INI檔案中時沒有引号,布爾真值用1表示,布爾假值用0表示。 

注釋以分号“;”開頭。 

二、定義 

1、在Interface的Uses節增加IniFiles; 

2、在Var變量定義部分增加一行: 

myinifile:Tinifile; 

然後,就可以對變量myinifile進行建立、打開、讀取、寫入等操作了。 

三、打開INI檔案 

myinifile:=Tinifile.create(program.ini); 

上面這一行語句将會為變量myinifile與具體的檔案program.ini建立聯系,然後,就可以通過變量myinifile,來讀寫program.ini檔案中的關鍵字的值了。 

值得注意的是,如果括号中的檔案名沒有指明路徑的話,那麼這個Program.ini檔案會存儲在Windows目錄中,把Program.ini檔案存儲在應用程式目前目錄中的方法是:為其指定完整的路徑及檔案名。下面的兩條語句可以完成這個功能: 

Filename:=ExtractFilePath(Paramstr 

(0))+program.ini; 

myinifile:=Tinifile.Create(filename); 

四、讀取關鍵字的值 

針對INI檔案支援的字元串、整型數值、布爾值三種資料類型,TINIfiles類提供了三種不同的對象方法來讀取INI檔案中關鍵字的值。 

假設已定義變量vs、vi、vb分别為string、integer、boolean類型。 

vs:=myinifile.Readstring 

(小節名,關鍵字,預設值); 

vi:=myinifile.Readinteger 

(小節名,關鍵字,預設值); 

vb:=myinifile.Readbool 

(小節名,關鍵字,預設值); 

其中預設值為該INI檔案不存在該關鍵字時傳回的預設值。 

五、寫入INI檔案 

同樣的,TInifile類也提供了三種不同的對象方法,向INI檔案寫入字元串、整型數及布爾類型的關鍵字。 

myinifile.writestring(小節名,關鍵字,變量或字元串值); 

myinifile.writeinteger(小節名,關鍵字,變量或整型數值); 

myinifile.writebool(小節名,關鍵字,變量或True或False); 

當這個INI檔案不存在時,上面的語句還會自動建立該INI檔案。 

六、删除關鍵字 

除了可用寫入方法增加一個關鍵字,Tinifile類還提供了一個删除關鍵字的對象方法: 

myinifile.DeleteKey(小節名,關鍵字); 

七、小節操作 

增加一個小節可用寫入的方法來完成,删除一個小節可用下面的對象方法: 

myinifile.EraseSection(小節名); 

另外Tinifile類還提供了三種對象方法來對小節進行操作: 

myinifile.readsection(小節名,TStrings變量);可将指定小節中的所有關鍵字名讀取至一個字元串清單變量中; 

myinifile.readsections(TStrings變量);可将INI檔案中所有小節名讀取至一個字元串清單變量中去。 

myinifile.readsectionvalues(小節名,TStrings變量);可将INI檔案中指定小節的所有行(包括關鍵字、=、值)讀取至一個字元串清單變量中去。 

八、釋放 

在适當的位置用下面的語句釋放myinifile: 

myinifile.distory; 

九、一個執行個體 

下面用一個簡單的例子(如圖),示範了建立、讀取、存貯INI檔案的方法。myini.ini檔案中包含有“程式參數”小節,和使用者名稱(字元串)、是否正式使用者(布爾值)和已運作時間(整型值)三個關鍵字。程式在窗體建立讀取這些資料,并在窗體釋放時寫myini.ini檔案。 

附源程式清單 

unitUnit1; 

interface 

uses 

Windows,Messages,SysUtils,Classes,Graphics, 

Controls,Forms,Dialogs,inifiles,StdCtrls,ExtCtrls; 

type 

TForm1=class(TForm) 

Edit1:TEdit; 

CheckBox1:TCheckBox; 

Edit2:TEdit; 

Label1:TLabel; 

Label2:TLabel; 

Timer1:TTimer; 

Label3:TLabel; 

procedureFormCreate(Sender:TObject); 

procedureFormDestroy(Sender:TObject); 

procedureTimer1Timer(Sender:TObject); 

private 

{Privatedeclarations} 

public 

{Publicdeclarations} 

end; 

var 

Form1:TForm1; 

implementation 

var 

myinifile:TInifile; 

{$R*.DFM} 

procedureTForm1.FormCreate(Sender:TObject); 

var 

filename:string; 

begin 

filename:=ExtractFilePath(paramstr(0))+myini.ini; 

myinifile:=TInifile.Create(filename); 

edit1.Text:=myinifile.readstring 

(程式參數,使用者名稱,預設的使用者名稱); 

edit2.text:=inttostr(myinifile.readinteger 

(程式參數,已運作時間,0)); 

checkbox1.Checked:=myinifile.readbool 

(程式參數,是否正式使用者,False); 

end; 

procedureTForm1.FormDestroy(Sender:TObject); 

begin 

myinifile.writestring(程式參數,使用者名稱,edit1.Text); 

myinifile.writeinteger(程式參數,已運作時間, 

strtoint(edit2.text)); 

myinifile.writebool(程式參數,是否正式使用者, 

checkbox1.Checked); 

myinifile.Destroy; 

end; 

procedureTForm1.Timer1Timer(Sender:TObject); 

begin 

edit2.Text:=inttostr(strtoint(edit2.text)+1); 

end; 

end.  

繼續閱讀