人類的悲歡并不相通肤粱,我只覺(jué)得他們吵鬧
一弹囚、 為什么要使用ini文件?
??作為工控人員领曼,在開(kāi)發(fā)上位機(jī)的過(guò)程中鸥鹉,經(jīng)常會(huì)碰到這種需求:甲方要求在每次運(yùn)行軟件時(shí),軟件的初始配置信息需要和上次退出時(shí)的配置信息保持相同庶骄,如上一次使用過(guò)程中設(shè)置的溫度報(bào)警值毁渗、壓力報(bào)警值等參數(shù)的設(shè)置信息;本此試驗(yàn)過(guò)程中单刁,會(huì)根據(jù)實(shí)際情況重新設(shè)置新的報(bào)警值并保存下來(lái)灸异,方便下一次試驗(yàn)時(shí)直接使用。
??要實(shí)現(xiàn)這個(gè)目標(biāo)羔飞,可以使用ini文件肺樟,將這些配置信息存儲(chǔ)到ini文件中,當(dāng)程序開(kāi)始運(yùn)行并初始化時(shí)逻淌,讀取該ini文件里面的內(nèi)容進(jìn)行軟件的初始化么伯,在程序運(yùn)行過(guò)程中,一旦用戶修改配置信息卡儒,軟件就及時(shí)將當(dāng)前的修改配置信息保存到ini文件中田柔。
二、 ini文件簡(jiǎn)介
??ini是英文“初始化”(initialization)的縮寫骨望,一種文件擴(kuò)展名硬爆,也就是一種文件格式。正如其英語(yǔ)所表示的意思擎鸠,ini文件被用來(lái)對(duì)操作系統(tǒng)或特定程序初始化或進(jìn)行參數(shù)設(shè)置缀磕,是某些平臺(tái)或軟件上配置文件的非正式標(biāo)準(zhǔn),常見(jiàn)于Windows操作系統(tǒng)。打開(kāi)Win平臺(tái)電腦的C盤虐骑,在一些系統(tǒng)文件的根目錄中可以很輕松的找到這種類型的配置文件准验,如下圖所示:
??隨著Windows操作系統(tǒng)引入注冊(cè)表以后,其逐漸取代了ini文件統(tǒng)管Windows各項(xiàng)配置的功能廷没,ini類型的配置文件才在系統(tǒng)中大幅減少。但是其配置參數(shù)的理念被廣泛使用到其它各種應(yīng)用軟件中垂寥,用于保存程序的一些固定參數(shù)颠黎,如應(yīng)用軟件登錄的用戶名和密碼、溫度報(bào)警的閾值等信息滞项。
??ini文件的類容格式主要由:[section]段(或節(jié))和key - value(鍵值對(duì))組成狭归。“段”用方括號(hào)括起來(lái)文判,單獨(dú)占一行过椎,“鍵值對(duì)”另占一行。個(gè)人感覺(jué)與python的字典dict數(shù)據(jù)類型有點(diǎn)相似戏仓,只是表現(xiàn)形式有點(diǎn)差別疚宇,ini文件格式如下圖所示:
??同一個(gè)ini文件中的段名必須唯一。每個(gè)字段由一系列“=”隔開(kāi)的鍵和鍵值組成赏殃,鍵名代表配置選項(xiàng)敷待,值代表該選項(xiàng)的設(shè)置,同一個(gè)段內(nèi)鍵名必須唯一仁热,但不同段之間的鍵名并無(wú)關(guān)系榜揖。等號(hào)左邊的字符串為鍵名,右邊的字符串為鍵值抗蠢。
三举哟、如何新建 ini文件
??1、在電腦桌面右鍵新建一個(gè)文本文檔迅矛,也就是txt文件妨猩,然后重命名該文件,將該文件的后綴由“.txt”修改為“.ini”诬乞,然后點(diǎn)擊回車册赛、點(diǎn)確定就OK了,如下圖所示的ini文件:
??2震嫉、由于ini文件本質(zhì)上還是文本文件,在Windows操作系統(tǒng)上直接雙擊打開(kāi)就可以進(jìn)行內(nèi)容的編輯了。由于人人可以編輯,微軟后來(lái)就用注冊(cè)表逐漸取代了ini文件的配置功能。但是ini文件還是由自己的優(yōu)勢(shì)的镰官,簡(jiǎn)單易懂,易于編輯拓哺,復(fù)制簡(jiǎn)便础淤,這都是ini文件的優(yōu)點(diǎn)玻侥。
??3姑食、特別注意
??我們?cè)谛陆╰xt文件的時(shí)候煌茬,txt文件有兩種格式浑吟,一個(gè)是“UTF-8”格式,如下圖所示:
??另一種格式是“ANSI”耗溜,實(shí)際上就是GBK格式,如下圖所示:
??我為什么要把txt文件的兩種格式拿出來(lái)單獨(dú)說(shuō)呢省容?
??主要是從txt文件變來(lái)的ini文件抖拴,編碼模式與txt是一樣的。而我在實(shí)際的編程過(guò)程中發(fā)現(xiàn):LabVIEW無(wú)法識(shí)別“UTF-8”格式的ini文件腥椒,即便你寫的所有步驟都是正確的阿宅,程序仍然讀不到配置文件中的信息。
??而當(dāng)所有程序不變笼蛛,把ini文件改為“ANSI”格式后洒放,程序就可以順利讀到配置文件里的信息了。至于如何把txt文件的編碼格式改為“ANSI”滨砍,大家就自行百度吧往湿,貌似要修改注冊(cè)表。一個(gè)比較簡(jiǎn)便的方法是惋戏,找一個(gè)ANSI格式的ini文件领追,復(fù)制過(guò)來(lái),然后按自己的需要進(jìn)行修改就可以了响逢。當(dāng)然绒窑,如果你電腦txt文件的默認(rèn)格式就是ANSI,就不用管我說(shuō)的這些廢話舔亭。
??新建的ini配置文件放在LabVIEW項(xiàng)目所在的文件根目錄里些膨,方便后面vi程序的讀取和寫入。
四钦铺、實(shí)戰(zhàn)練習(xí)
??LabVIEW實(shí)戰(zhàn)練習(xí)主要分為3個(gè)部分:讀取ini文件订雾、寫入ini文件以及同時(shí)讀取和寫入ini文件。單獨(dú)的read和write相對(duì)簡(jiǎn)單一些职抡,同時(shí)read和write更接近我們實(shí)際的項(xiàng)目編程葬燎。
??LabVIEW中提供了一組用于操作配置文件的函數(shù)集,位于函數(shù)選板“編程”“文件I/O”“配置文件VI”子選板中,如下圖所示:
??這些函數(shù)集實(shí)際是經(jīng)過(guò)二次封裝的VI程序谱净,可以完成對(duì)ini配置文件的打開(kāi)及關(guān)閉操作窑邦、段和鍵的讀寫及刪除操作等功能。而“讀取健”模塊本身是一個(gè)多態(tài)VI壕探,如下圖所示:
??點(diǎn)擊該多態(tài)vi圖標(biāo)上的小三角形冈钦,我們可以看到,該多態(tài)vi可以讀取的數(shù)據(jù)類型包括:布爾李请、雙精度浮點(diǎn)數(shù)瞧筛、I32、路徑导盅、字符串和U32较幌。如果我們需要讀取float型數(shù)據(jù),直接選擇雙精度就可以了白翻,或者用默認(rèn)的自動(dòng)狀態(tài)乍炉,程序會(huì)根據(jù)具體的實(shí)際情況,將讀取的配置文件數(shù)據(jù)轉(zhuǎn)換相應(yīng)的數(shù)據(jù)類型滤馍。至于啥是多態(tài)vi岛琼,我們暫時(shí)不要管它,先用再說(shuō)巢株,等以后對(duì)LabVIEW了解得比較深入了槐瑞,理解這些概念都不難。LabVIEW中對(duì)配置文件的編程方式同普通文本文件類似阁苞,遵循著打開(kāi)困檩、讀寫及關(guān)閉的三步原則。后面給出的示例都是遵循該思路來(lái)進(jìn)行操作的猬错。
??1窗看、我的開(kāi)發(fā)環(huán)境
??Windows10(64bit),LabVIEW2017(32bit)
??2倦炒、讀取ini文件
??這部分要達(dá)到的功能比較簡(jiǎn)單显沈,就是將上圖(ANSI格式文件)中的溫度、壓力和流量對(duì)應(yīng)的數(shù)據(jù)進(jìn)行讀取并在前面板對(duì)應(yīng)的數(shù)值顯示框中顯示出來(lái)逢唤。具體實(shí)現(xiàn)代碼如下圖所示:
??從上圖可以看到拉讯,前面板只有3個(gè)數(shù)值顯示框,程序面板主要包括“打開(kāi)”鳖藕、“讀取”魔慷、“關(guān)閉”3個(gè)函數(shù)模塊≈鳎“打開(kāi)”模塊需要填寫ini文件的文件路徑院尔,才能打開(kāi)相應(yīng)的配置文件蜻展;ini文件中有三個(gè)鍵值對(duì),所以我使用了3個(gè)Read Key.vi模塊來(lái)同時(shí)讀取這3個(gè)數(shù)據(jù)邀摆,讀取配置信息完成后纵顾,使用“Close Config Data.vi”關(guān)閉該配置文件。程序運(yùn)行的結(jié)果如下圖所示:
??從上圖中我們可以看到栋盹,LabVIEW程序成功讀到了文件名為“配置.ini”文件中對(duì)應(yīng)的數(shù)據(jù)施逾,并在前面板中顯示出來(lái)。這個(gè)時(shí)候就有個(gè)問(wèn)題例获,上文中ini文件的字段中有3個(gè)鍵值對(duì)汉额,要使用3個(gè)Read Key.vi模塊來(lái)進(jìn)行讀取,如果配置文件中字段的鍵值對(duì)有10個(gè)或者20個(gè)榨汤,難道也要用20個(gè)Read Key.vi模塊來(lái)進(jìn)行讀取嗎蠕搜?那程序也太長(zhǎng)了吧?
??答案顯然是不需要收壕,當(dāng)然你非要使用這種一字長(zhǎng)蛇陣也不是不可以讥脐。當(dāng)數(shù)量比較多的時(shí)候,我們第一個(gè)需要考慮點(diǎn)就是使用for循環(huán)啼器,有幾個(gè)數(shù)據(jù),就循環(huán)幾次俱萍,這樣程序看起來(lái)會(huì)簡(jiǎn)潔很多端壳,也方便自己后期閱讀和修改。
??同樣也是讀取上圖中文件名為“配置.ini”的文件枪蘑,加入for循環(huán)后损谦,可以達(dá)到同樣的效果,實(shí)現(xiàn)程序如下圖所示:
??上圖中最主要的改變就是把需要讀取的健名全部放到一個(gè)字符串?dāng)?shù)組中岳颇,最后讀取的數(shù)據(jù)也被放到一個(gè)數(shù)組中照捡,后面索引一下數(shù)組就可以得到相應(yīng)的數(shù)據(jù)。程序運(yùn)行的結(jié)果與上面的結(jié)果是一樣的话侧,就不貼出來(lái)了栗精。
??3、寫入ini文件
??寫入部分的程序也比較簡(jiǎn)單瞻鹏,主要思路是通過(guò)在前面板的數(shù)值輸入框中輸入自己想要設(shè)定的數(shù)據(jù)悲立,新的數(shù)據(jù)就寫入到了對(duì)應(yīng)的ini配置文件里,以實(shí)現(xiàn)vi程序?qū)ni文件的寫入操作新博,具體實(shí)現(xiàn)代碼如下圖所示:
??前面板就是3個(gè)數(shù)值輸入框薪夕,分別對(duì)應(yīng)溫度、壓力赫悄、流量原献;程序面板也遵循打開(kāi)馏慨、讀寫及關(guān)閉的三步原則。Write Key.vi函數(shù)模塊放在了for循環(huán)中姑隅,該模塊的輸入端參數(shù)分別是段名写隶、鍵名和將要寫入的數(shù)值3個(gè)部分,段名和寫入的值有3個(gè)粤策,所以用數(shù)組來(lái)進(jìn)行輸入樟澜。不然,就要使用3個(gè)Write Key.vi函數(shù)模塊進(jìn)行寫入操作叮盘,不是特別簡(jiǎn)潔秩贰。程序運(yùn)行的結(jié)果如下圖所示:
??從上述結(jié)果可以看到,ini文件的原始數(shù)據(jù)分別是20.0柔吼、30.0毒费、40.0,運(yùn)行程序后愈魏,在前面板的數(shù)值輸入框輸入新的值觅玻,關(guān)閉vi程序后,新的數(shù)據(jù)其實(shí)已經(jīng)寫入到了ini文件中培漏,但是ini文件無(wú)法自動(dòng)刷新數(shù)據(jù)溪厘,所以需要重新打開(kāi)ini文件,新的數(shù)據(jù)就刷新出來(lái)了牌柄。由于在LabVIEW中畸悬,雙精度浮點(diǎn)數(shù)默認(rèn)是精確到小數(shù)點(diǎn)后第六位,所以我們會(huì)看到珊佣,寫入并保存到ini文件中的數(shù)據(jù)蹋宦,小數(shù)點(diǎn)后都有6個(gè)0。
??這里面還有小問(wèn)題咒锻,就是點(diǎn)擊程序運(yùn)行的時(shí)候冷冗,由于每個(gè)數(shù)值輸入框都有一個(gè)默認(rèn)值0,這個(gè)時(shí)候惑艇,程序一運(yùn)行蒿辙,這3個(gè)數(shù)值輸入框的默認(rèn)值0其實(shí)已經(jīng)寫入到了ini文件中了,只是我們手動(dòng)輸入新值后敦捧,新值才把這個(gè)寫入默認(rèn)值0替換掉了须板。
先賣個(gè)關(guān)子,下面會(huì)講到如何規(guī)避這個(gè)問(wèn)題兢卵。
??4习瑰、同時(shí)讀取和寫入ini文件
??同時(shí)讀/寫ini文件的編程思路是:第一、程序運(yùn)行時(shí)秽荤,直接讀取ini配置文件中的原始數(shù)據(jù)并在前面板顯示出來(lái)甜奄;第二柠横、自定義的其他功能程序;第三课兄、在前面板數(shù)值輸入框中輸入自己想要修改的數(shù)據(jù)牍氛,程序會(huì)自動(dòng)寫入到ini文件并保存下來(lái)。3個(gè)部分采用平鋪式順序結(jié)構(gòu)進(jìn)行編寫烟阐,具體的實(shí)現(xiàn)程序如下圖所示:
??由上圖可知搬俊,順序結(jié)構(gòu)的第一幀是ini文件的讀取部分,在程序開(kāi)始運(yùn)行時(shí)蜒茄,讀取原始ini文件中的內(nèi)容唉擂,在上面的代碼中,首先在當(dāng)前vi程序目錄下使用“Open Config Data.vi”函數(shù)模塊打開(kāi)“配置.ini”文件檀葛,將該函數(shù)模塊的參數(shù)“在必要時(shí)創(chuàng)建文件”設(shè)為假玩祟,即文件不存在時(shí)不要?jiǎng)?chuàng)建文件,若文件不存在屿聋,則該函數(shù)會(huì)返回一個(gè)錯(cuò)誤空扎,此時(shí)不作任何處理,否則讀取該ini文件润讥。此部分與本節(jié)第2小節(jié)的程序基本一致转锈,就不做過(guò)多解釋。
??順序結(jié)構(gòu)的第二幀是實(shí)現(xiàn)自定義功能的部分楚殿,如果沒(méi)有其他功能需求黑忱,也可以直接刪掉
??順序結(jié)構(gòu)的第三幀是ini文件的寫入部分,程序使用事件結(jié)構(gòu)勒魔,就是為了規(guī)避上面第3小節(jié)提到的程序已運(yùn)行就把輸入框的默認(rèn)值寫入到ini文件中,使用事件結(jié)構(gòu)后菇曲,只有當(dāng)相應(yīng)的輸入框的數(shù)值發(fā)生變化冠绢,才會(huì)將新值寫入到ini文件中。程序的具體細(xì)節(jié)與上面第3小節(jié)基本一樣常潮,也不做過(guò)多解釋弟胀。程序運(yùn)行的結(jié)果如下圖所示:
??從運(yùn)行結(jié)果圖中可以看到,程序一運(yùn)行時(shí)喊式,就讀到了ini文件的原始數(shù)據(jù)孵户,隨著我在數(shù)據(jù)輸入框輸入新的數(shù)值,數(shù)值就寫入到了ini文件岔留,重啟ini文件可以到新的數(shù)據(jù)已保存到其中夏哭。
五、小結(jié)
??1献联、注意txt文件的編碼格式竖配,如果不是ANSI格式何址,需要將其更改為ANSI格式,否則LabVIEW無(wú)法讀寫該配置文件进胯;
??2用爪、寫入部分的程序盡量使用事件結(jié)構(gòu),可以規(guī)避輸入框默認(rèn)值直接寫入到配置文件中胁镐;
??3偎血、本文只列舉了雙精度浮點(diǎn)數(shù)的讀寫實(shí)現(xiàn)過(guò)程,其他類型數(shù)據(jù)的讀寫程序都差不多盯漂,最重要的是理解編程的思路颇玷,并學(xué)會(huì)舉一反三;
??4宠能、記得多學(xué)多練亚隙,活學(xué)活用。