Ⅰ vb 怎麼讀取ini文件
為了方便用戶使用和使系統具有靈活性,大多數-dows應用程序將用戶所做的選擇以及各種變化的系統信息記錄在初始化(INI)文件中。因此,當系統的環境發生變化時,可以直接修改INI文件,而無需修改程序。由此可見,INI文件對系統功能是至關重要的。本文將介紹採用VisualBasicforWindows(下稱VB)開發Windows應用程序時如何讀寫INI文件。
INI文件是文本文件,由若幹部分(section)組成,在每個帶括弧的標題下面,是若干個以單個單詞開頭的關鍵詞(keyword)和一個等號,每個關鍵詞會控制應用程序某個功能的工作方式,等號右邊的值(value)指定關鍵詞的操作方式。其一般形式如下:
[section1]
keyword1=valuel
keyword2=value2
……
[section2]
keyword1=value1
keyword2=value2
……
其中,如果等號右邊無任何內容(即value為空),那就表示Windows應用程序已為該關鍵詞指定了預設值,如果在整個文件中找不到某個關鍵詞(或整個一部分),那同樣表示為它們指定了預設值。各個部分所出現的順序是無關緊要的,在每一個部分里,各個關鍵詞的順序同樣也無關緊要。
讀寫INI文件通常有兩種方式:一是在Windows中用"記事本"(Notepad)對其進行編輯,比較簡單,無需贅述;二是由Windows應用程序讀寫INI文件,通常是應用程序運行時讀取INI文件中的信息,退出應用程序時保存用戶對運行環境的某些修改。
關鍵詞的值的類型多為字元串或整數型,應分兩種情況讀寫。為了使程序具有可維護性和可移植性,最好把對INI文件的讀寫封裝在一個模塊(RWINI.BAS)中,在RWI-NI.BAS中構造GetIniS和GetIniN函數以及SetIniS和Se-tIniN過程,在這些函數和過程中需要使用WindowsAPI的"GetPrivateprofileString"、"GetPrivateProfileInt"和"WritePrivateProfileString"函數。
RWINI.BAS模塊的程序代碼如下:
在General-Declearation部分中聲明使用到的WindowsAPI函數:
Declare Function GetprivateprofileString Lib"Ker-nel"(ByVallpAppName As String,ByVallpKeyName As String,ByVallpDefault As String,ByVal lpRetrm-String As String,ByVal cbReturnString As Integer,ByVal Filename As String)As Integer
Declare FunctionGetPrivatePfileInt Lib "Kernel"(ByVal lpAppName As String,ByVal lpKeyName As String,ByVal lpDefault As Integer,ByVal Filename As String)As Integer
Declare Lib "Kernel"(ByVal lpApplicationName As String,ByVal lpKeyName As String,ByVal lpString As String,ByVal lplFileName As String)As Integer
Function GetIniS(ByVal SectionName As String,ByVal KeyWord As String,ByVal DefString As String)As String
Dim ResultString As String * 144,Temp As Integer
Dims As String,i As Integer
Temp%=GetPrivateProfileString(SectionName,KeyWord,"",ResultString,144,AppProfileName())
『檢索關鍵詞的值
IfTemp%>0Then『關鍵詞的值不為空
s=""
Fori=1To144
IfAsc(Mid$(ResultString,I,1))=0Then
ExitFor
Else
s=s&Mid$(ResultString,I,1)
EndIf
Next
Else
Temp%=WritePrivateProfilesString(sectionname,KeyWord,DefString,ppProfileName())
『將預設值寫入INI文件
s=DefString
EndIf
GetIniS=s
EndFunction
FunctionGetIniN(ByValSectionNameAsString,ByValKeyWordAsString,ByValDefValue
AsIneger)AsInteger
DimdAsLong,sAsString
d=DefValue
GetIniN=GetPrivateProfileInt(SectionName,
KeyWord,DefValue,ppProfileName())
Ifd<>DefValueThen
s=""&d
d=WritePrivateProfileString(SectionName,
KeyWord,s,AppProfileName())
EndIf
EndFunction
SubSetIniS(ByValSectionNameAsString,BtVaKeyWordAsString,ByValValStr
AsString)
Dimres%
res%=WritePrivateprofileString(SectionName,KeyWord,ValStr,AppProfileName())
EndSub
SubSetIniN(ByValSectionNameAsString,ByValKeyWordAsString,ByValValInt
AsInteger)
Dimres%,s$
s$=Str$(ValInt)
res%=WriteprivateProfileString(SectionName,KeyWord,s$,AppProfileName())
EndSub
SectionName為每一部分的標題,KeyWord為關鍵詞,GetIniS和GetIniN中的DefValue為關鍵詞的預設值,SetIniS和SetIniN的ValStr和ValInt為要寫入INI文件的關鍵詞的值。為了能更好地說明如何使用以上函數和過程,下面舉兩個實例。
實例1:
開發應用程序通常要使用資料庫和其它一些文件,這些文件的目錄(包括路徑和文件名)不應在程序中固定,而是保存在INI文件中,程序運行時由INI文件中讀入。讀入資料庫文件的代碼如下:
DimDatabasenameAsString
Databasename=GetIniS("資料庫","職工","")
IfDatabaseName=""ThenDatabaseName=InputBox("請輸入資料庫《職工》的目錄"),
App.Title)』也可通過"文件對話框"進行選擇
OnErrorResumeNext
Setdb=OpenDatabas(DatabaseName)
IfErr<>0Then
MsgBox"打開資料庫失敗!",MB-
ICONSTOP,App.Title:GotoErrorProcessing
Else
SetIniS"資料庫","職工",DatabaseName
EndIf
OnErrorGoTo0
……
實例2:
為了方便用戶操作,有時需要保存用戶界面的某些信息,例如窗口的高度和寬度等。裝載窗體時,從INI文件中讀入窗體高度和寬度,卸載窗體時將窗體當前高度和寬度存入INI文件,代碼如下:
Sub Form1_Load()
……
Forml.Height=GetIniN("窗體1","高度",6000)
Form1.Width=GetIniN("窗體1","高度",4500)
EndSub
……
Sub Form1_Unload()
……
SetIniN"窗體1","高度",Me.Height
SetIniN"窗體1,"寬度",Me.Width
……
End Sub
Ⅱ 怎麼遍歷讀取ini文件的所有節點
ini文件讀取一般要引入win32API函數來完成,可以參考以下的函數ReadSection,結果以StringCollection的形式返回,你可以自己再做後續處理: public string FileName; //INI文件名 //聲明讀寫INI文件的API函數 [DllImport("kernel32")]
Ⅲ C語言如何新建ini文件,讀取ini文件跟寫入ini文件
就是fopen()就可以新建文件吧,然後 fgetc(),fgets(),fputc(),fputs(),fseek(),feof(),rewind(),fread(),fwrite()等函數可以完成文件的讀寫以及定位等,內這些函數都在stdio.h中。
例如要容建立一個temp.ini文件的話,就是
main()
{
FILE *fp;
...
if((fp=fopen("temp.ini","w"))==NULL)
...
fclose(fp);
}
Ⅳ vc++讀取ini文件,根據節點和子節點求出value值,不是用GetPrivateProfileString GetPrivateProfileInt 方
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
/*
在VC++裡面讀寫配置文件最好還是用GetPrivateProfileString()和GetPrivateProfileInt()函數,
如果不用這兩個函數,就只有自己寫讀文件的代碼
首先建立一個config.ini文件,內容如下
[system]
server = 192.168.0.1
port = 5000
[timeout]
link = 10000
send = 20000
recv = 20000
*/
//去掉字元串首尾空格
void Trim(char *pStr)
{
char *pWork = pStr + strlen(pStr) - 1;
char *pEnd = pStr + strlen(pStr);
while ( pWork >= pStr )
{
if ( *pWork == ' ' || *pWork == '\r' || *pWork == '\n' || *pWork == '\t' || *pWork == '\b' )
{
memmove(pWork,pWork+1,pEnd-pWork);
}
pWork--;
}
}
//拆分key = value樣式的字元串為key和value
void SplitKeyAndValue(char *LineData,char *OutKey,unsigned long KeySize,char *OutValue,unsigned long ValueSize)
{
char *pWork = LineData;
memset(OutKey,0x0,KeySize);
memset(OutValue,0x0,ValueSize);
while ( *pWork != '=' && pWork <= LineData + strlen(LineData) )
{
pWork++;
}
strncpy(OutKey,LineData,(pWork-LineData) > (KeySize - 1) ? (KeySize - 1) : (pWork-LineData));
Trim(OutKey);
strncpy(OutValue,
pWork+1,
(strlen(LineData) - (pWork-LineData)) > (ValueSize - 1) ? (ValueSize - 1) : (strlen(LineData) - (pWork-LineData)));
Trim(OutValue);
}
//從文件中讀取一行數據
void ReadLineFromFile(FILE *pf,char *OutLine,unsigned long OutSize)
{
char tmpC = 0;
int index = 0;
memset(OutLine,0x0,OutSize);
while ( !feof(pf) )
{
fread(&tmpC,1,1,pf);
if ( tmpC == '\n' )
{
OutLine[index] = '\n';
break;
}
else
{
OutLine[index] = tmpC;
index++;
if ( index + 1 >= OutSize )
{
OutLine[index] = 0x0;
break;
}
}
}
}
/*
char *AppName---結點名稱
char *KeyName---配置名稱
char *DefaultValue----沒有指定結點或配置時返回的默認值
char *OutStr---接收輸出的字元串
unsigned long OutStrSize---接收輸出字元串的長度
char *ConfigFileName---配置文件的名稱
*/
void ReadConfigString(char *AppName,char *KeyName,char *DefaultValue,char *OutStr,unsigned long OutStrSize,char *ConfigFileName = NULL)
{
if ( NULL == OutStr )
{
printf("錯誤:調用ReadConfigString()函數前必須首先給OutStr分配OutStrSize大小的空間!");
return;
}
//給返回值賦初值
strncpy(OutStr,DefaultValue,OutStrSize);
//獲取配置文件名
char RightConfigName[1024];
GetMoleFileNameA(NULL,RightConfigName,1024);
char *pWork = RightConfigName + strlen(RightConfigName);
if ( NULL == ConfigFileName || strlen(ConfigFileName) < 1 )
{
while ( *pWork != '.' )
{
pWork--;
}
strcpy(pWork,".ini");
}
else
{
while ( *pWork != '\\' )
{
pWork--;
}
strcpy(pWork+1,ConfigFileName);
}
//保存當前結點名稱
char CurrentAppName[1024];
memset(CurrentAppName,0x0,1024);
//獲取結點名稱
char RightAppName[1024];
char RightAppNameTmp[1024];
strcpy(RightAppNameTmp,AppName);
Trim(RightAppNameTmp);
strcpy(RightAppName,"[");
strcat(RightAppName,RightAppNameTmp);
strcat(RightAppName,"]");
//打開文件讀
char ReadLine[1024];
FILE *pf = fopen(RightConfigName,"rt");
if ( NULL == pf )
{
perror("打開配置文件錯誤:");
return;
}
while( !feof(pf) )
{
memset(ReadLine,0x0,1024);
ReadLineFromFile(pf,ReadLine,1024);//從文件中讀取一行
//去掉首尾空格
Trim(ReadLine);
if ( strlen(ReadLine) < 1 )
{
continue;
}
if ( ReadLine[0] == '[' && ReadLine[strlen(ReadLine)-1] == ']' )
{
strcpy(CurrentAppName,ReadLine);
}
else
{
char tmpLineKey[1024];
char tmpLineValue[1024];
SplitKeyAndValue(ReadLine,tmpLineKey,1024,tmpLineValue,1024);
if ( strcmp(CurrentAppName,RightAppName) == 0 && strcmp(tmpLineKey,KeyName) == 0 )
{
strncpy(OutStr,tmpLineValue,OutStrSize);
fclose(pf);
return;
}
}
}
fclose(pf);
}
int main(void)
{
char AppName[1024];
printf("輸入結點名稱 = ");
scanf("%s",AppName);
char KeyName[1024];
printf("輸入鍵名稱 = ");
scanf("%s",KeyName);
char Value[1024];
memset(Value,0x0,1024);
ReadConfigString(AppName,KeyName,"沒有此配置",Value,1024,"config.ini");
printf("找到配置值為 = %s\n",Value);
fflush(stdin);
getchar();
return 0;
}