labwindows/cvi 2019入门(3)——读写INI文件

应用程序经常需要保存一些的有用的信息等,如下次打开软件时要加载的数据,程序设定的基本工艺参数等等。INI文件是一种文本格式的文件,方便修改和配置。LabWindows/CVI中对INI文件的操作提供了丰富的接口函数,本文在阅读帮助文档的基础上,提供了一个最基本的例子程序,能够满足大多数使用。

ini文件格式:

ini文件是initialization file的缩写,其用于保存参数设置。一般我们会将UI配置的界面参数保存在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创建的句柄。

CVI读写Ini文件实例程序

从模板新建项目,拖拽控件实现如下图布局。主要练习读写字符型、整型、浮点型、布尔型变量的方法。

image.png

新建项目中要导入NI的inifile.fp文件库,同时在程序中添加inifile.h头文件。
C:\Program Files (x86)\National Instruments\CVI2019\toolslib\toolbox\inifile.fp

image.png

全部程序代码如下,记得initext变量用后释放存储。

#include <cvirte.h>     
#include <userint.h>
#include "inifile.h"
#include "CviIniFile.h"

static int panelHandle;
//名字值存储
char nameValue[256]={0};
//年龄值存储
int ageValue=10;
//是否管理员存储
BOOL adminValue=TRUE;
//ip地址存储
char IPValue[20]={0};
//端口存储
int portValue = 123;
//数据大小存储
double sizeValue = 1.2;
//获取控件中的设定值到全局变量
void GetCtrlValue()
{
    GetCtrlVal(panelHandle,PANEL_NAME,nameValue);
    GetCtrlVal(panelHandle,PANEL_AGE,&ageValue);
    GetCtrlVal(panelHandle,PANEL_ADMIN,&adminValue);
    GetCtrlVal(panelHandle,PANEL_IP,IPValue);
    GetCtrlVal(panelHandle,PANEL_PORT,&portValue);
    GetCtrlVal(panelHandle,PANEL_SIZE,&sizeValue);
}
//将全局变量的值更新到控件中
void SetCtrlValue()
{
    SetCtrlVal(panelHandle,PANEL_NAME,nameValue);
    SetCtrlVal(panelHandle,PANEL_AGE,ageValue);
    SetCtrlVal(panelHandle,PANEL_ADMIN,adminValue);
    SetCtrlVal(panelHandle,PANEL_IP,IPValue);
    SetCtrlVal(panelHandle,PANEL_PORT,portValue);
    SetCtrlVal(panelHandle,PANEL_SIZE,sizeValue);
}
int main (int argc, char *argv[])
{
    if (InitCVIRTE (0, argv, 0) == 0)
        return -1;  /* out of memory */
    if ((panelHandle = LoadPanel (0, "CviIniFile.uir", PANEL)) < 0)
        return -1;
    DisplayPanel (panelHandle);
    RunUserInterface ();
    DiscardPanel (panelHandle);
    return 0;
}

int CVICALLBACK panelCB (int panel, int event, void *callbackData,
                         int eventData1, int eventData2)
{
    switch (event)
    {
        case EVENT_GOT_FOCUS:

            break;
        case EVENT_LOST_FOCUS:

            break;
        case EVENT_CLOSE:

            break;
    }
    return 0;
}

int CVICALLBACK btnExit (int panel, int control, int event,
                         void *callbackData, int eventData1, int eventData2)
{
    switch (event)
    {
        case EVENT_COMMIT:
            QuitUserInterface (0);
            break;
    }
    return 0;
}
//读取ini文件
int CVICALLBACK btnReadIniFile (int panel, int control, int event,
                                void *callbackData, int eventData1, int eventData2)
{
    switch (event)
    {
        case EVENT_COMMIT:
            int ret =0;
            IniText ReadIniFileHandle;
            ReadIniFileHandle = Ini_New(TRUE);
            ret = Ini_ReadFromFile(ReadIniFileHandle,"config.ini");
            if(ret==0)//读取文件成功
            {
                Ini_GetStringIntoBuffer(ReadIniFileHandle,"owner","Name",nameValue,sizeof(nameValue));
                Ini_GetInt(ReadIniFileHandle,"owner","Age",&ageValue);
                Ini_GetBoolean(ReadIniFileHandle,"owner","Admin",&adminValue);
                Ini_GetStringIntoBuffer(ReadIniFileHandle,"database","IP",IPValue,sizeof(IPValue));
                Ini_GetInt(ReadIniFileHandle,"database","Port",&portValue);
                Ini_GetDouble(ReadIniFileHandle,"database","Size",&sizeValue);
                
                SetCtrlValue();
            }
                        Ini_Dispose(ReadIniFileHandle);
            break;
    }
    return 0;
}
//写参数到ini文件中
int CVICALLBACK WriteIniFile (int panel, int control, int event,
                              void *callbackData, int eventData1, int eventData2)
{
    switch (event)
    {
        case EVENT_COMMIT:
            int ret =0;
            IniText SaveIniFileHandle;
            SaveIniFileHandle = Ini_New(TRUE);
            GetCtrlValue();
            Ini_PutString(SaveIniFileHandle,"owner","Name",nameValue);
            Ini_PutInt(SaveIniFileHandle,"owner","Age",ageValue);
            Ini_PutBoolean(SaveIniFileHandle,"owner","Admin",adminValue);
            Ini_PutString(SaveIniFileHandle,"database","IP",IPValue);
            Ini_PutInt(SaveIniFileHandle,"database","Port",portValue);
            Ini_PutDouble(SaveIniFileHandle,"database","Size",sizeValue);
                
            ret = Ini_WriteToFile(SaveIniFileHandle,"config.ini");
            Ini_Dispose(SaveIniFileHandle);
                
            break;
    }
    return 0;
}

欢迎交流QQ:491114509

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • [转]C/C++ 文件读写操作总结 在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以...
    天之道天知道阅读 5,196评论 0 7
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,776评论 0 38
  • 使用的过程根据使用的函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare() ...
    浪尖ON的水滴阅读 1,645评论 2 2
  • 本组函数用于处理文件。 存放工作文件的三个目录(含子目录)分别是:/HISTORY/<当前经纪商> – 特别提供的...
    牛在汇上飞阅读 380评论 0 0
  • 1.读书:万历十五年 时事造人,人亦造世。首辅申时行的妥协迂回政策,一定程度上免去了正面交锋的得不偿失,也同样助长...
    Reemou阅读 278评论 0 0