ini文件是initialization file的缩写,其用于保存参数设置。一般我们会将UI配置的界面参数保存在ini文件中,在程序下次启动时,读取ini文件配置信息,这样就不用重复配置程序参数。下面将介绍ini文件格式及LabwindowsCVI对ini文件的支持:
ini文件格式:
ini文件由键和节组成,如下所示:
键(keys):
键是ini文件的基本元素,每一个键又由名称和值组成,如下所示:
name = value
节(sections):
节是键的群组合,节由“[]”包围,如下所示:
[section]
LabwindowsCVI 对ini文件的支持:
LabwindowsCVI对ini操作的api如下所示:
Ini_New:
Ini_New用于创建一个IniText对象,其函数原型如下所示:
IniText Ini_New (int automaticSorting);
其中automaticSorting为ini文件中 键是否排序,非零值代表排序。
Ini_ReadFromFile:
Ini_ReadFromFile用于读取ini文件的内容,其函数原型如下所示:
int Ini_ReadFromFile (IniText handle, const char pathname[]);
其中handle为Ini_New返回的句柄,pathname为ini文件的路径。
Ini_GetInt:
Ini_GetInt用于读取整形键值,其函数原型如下所示:
int Ini_GetInt (IniText handle, const char sectionName[], const char tagName[], int *integerValue);
其中handle为IniText句柄,sectionName为节的名称,tagName为键的名称,integerValue为读取的键值。
Ini_GetDouble:
Ini_GetDouble用于读取双浮点型键值,其函数原型如下所示:
int Ini_GetDouble (IniText handle, const char sectionName[], const char tagName[], double *doubleValue);
其中handle为IniText句柄,sectionName为节的名称,tagName为键的名称,doubleValue为读取的键值。
Ini_GetStringIntoBuffer:
Ini_GetStringIntoBuffer用于读取字符串类型键值,其函数原型如下所示:
int Ini_GetStringIntoBuffer (IniText handle, const char sectionName[], const char tagName[], char buffer[], size_t bufferSize);
其中handle为IniText句柄,sectionName为节的名称,tagName为键的名称,buffer 为存放读取的字符串数据内存空间,bufferSize为读取字符串数据内存空间大小。
Ini_PutInt:
Ini_PutInt用于添加或修改整形键值,其函数原型如下所示:
int Ini_PutInt (IniText handle, const char sectionName[], const char tagName[], int integerValue);
其中handle为IniText句柄,sectionName为节的名称,tagName为键的名称,integerValue为写入的键值。
Ini_PutDouble:
Ini_PutDouble用于读取双浮点型键值,其函数原型如下所示:
int Ini_PutDouble (IniText handle, const char sectionName[], const char tagName[], double doubleValue);
其中handle为IniText句柄,sectionName为节的名称,tagName为键的名称,doubleValue为写入的键值。
Ini_PutString:
Ini_PutString用于读取字符串类型键值,其函数原型如下所示:
int Ini_PutString (IniText handle, const char sectionName[], const char tagName[], const char stringValue[]);
其中handle为IniText句柄,sectionName为节的名称,tagName为键的名称,stringValue为要写入的字符串键值。
Ini_WriteToFile:
Ini_WriteToFile用于将键值写入ini文件中,其函数原型如下所示:
int Ini_WriteToFile (IniText handle, const char pathname[]);
其中handle为IniText句柄,pathname为写入的ini文件路径。
Ini_Dispose:
Ini_Dispose用于清除释放Ini_New创建的资源,其函数原型如下所示:
void Ini_Dispose (IniText handle);
其中handle为Ini_New创建的句柄。
LabwindowsCVI ini项目实践:
新建一个LabwindowsCVI工程,然后往工程添加ini库文件,如下图所示:
这些库文件可以在LabwindowsCVI安装路径下找到,其路径为:C:\Users\Public\Documents\National Instruments\CVI2013\samples\toolbox
本工程ini测试代码如下所示,主要为iniReadTest和iniWriteTest函数:
#include "inifile.h"
#include <userint.h>
#include <cvirte.h>
#include "IniTest.h"
static int panelHandle;
IniText iniFileHandle;
int intValue = 10;
double doubleValue = 100.0;
char stringValue[256] = {0};
void iniReadTest(void)
{
int ret = 0;
iniFileHandle = Ini_New(1);
ret = Ini_ReadFromFile(iniFileHandle,"config.ini");
if(ret == 0)//successful
{
Ini_GetInt(iniFileHandle,"VALUE","INT_VALUE",&intValue);
Ini_GetDouble(iniFileHandle,"VALUE","DOUBLE_VALUE",&doubleValue);
Ini_GetStringIntoBuffer(iniFileHandle,"VALUE","STRING_VALUE",stringValue,sizeof(stringValue));
Ini_Dispose(iniFileHandle);
SetCtrlVal(panelHandle,PANEL_NUMERIC_INT,intValue);
SetCtrlVal(panelHandle,PANEL_NUMERIC_DOUBLE,doubleValue);
SetCtrlVal(panelHandle,PANEL_STRING_String,stringValue);
}
else if(ret == -97)//file not found
{
FILE *f;
f = fopen("config.ini","r+");
fclose(f);
Ini_ReadFromFile(iniFileHandle,"config.ini");
}
else
{
}
}
void iniWriteTest(void)
{
int ret = 0;
iniFileHandle = Ini_New(1);
ret = Ini_ReadFromFile(iniFileHandle,"config.ini");
if(ret == 0)//successful
{
}
else if(ret == -97)//file not found
{
FILE *f;
f = fopen("config.ini","r+");
fclose(f);
Ini_ReadFromFile(iniFileHandle,"config.ini");
}
else
{
}
Ini_PutInt(iniFileHandle,"VALUE","INT_VALUE",intValue);
Ini_PutDouble(iniFileHandle,"VALUE","DOUBLE_VALUE",doubleValue);
Ini_PutString(iniFileHandle,"VALUE","STRING_VALUE",stringValue);
Ini_WriteToFile(iniFileHandle,"config.ini");
Ini_Dispose(iniFileHandle);
}
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "IniTest.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
iniReadTest();//ini read test
RunUserInterface ();
GetCtrlVal(panelHandle,PANEL_NUMERIC_INT,&intValue);
GetCtrlVal(panelHandle,PANEL_NUMERIC_DOUBLE,&doubleValue);
GetCtrlVal(panelHandle,PANEL_STRING_String,stringValue);
iniWriteTest();//ini write test
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK quit (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface(0);
break;
}
return 0;
}
测试效果:
运行该LabwindowsCVI ini测试工程程序,往ini测试窗口中,输入整形值、浮点值、字符串值,然后单击退出,如下图示所示:
然后打开config.ini文件,可以看到UI界面配置的值已经保存下来,在程序下次运行时,其界面显示上次配置的参数。