LabVIEW數(shù)據(jù)記錄和存儲(一)—文本文件
文本文件是由若干行字符構(gòu)成的計算機文件,根據(jù)本文存儲方式的不同有多種格式,如doc、txt、inf等。通常所指的文本文件是指能夠被系統(tǒng)終端或者簡單的文本編輯器中接受的格式,可以認為這種文件是通用的、跨平臺的。對通用的英文文本文件而言,ASCII碼是最為常見的編碼標準;而如果需要存儲帶重音符號的英文或其它的非ASCII字符,則必須選擇一種字符編碼,如UTF-8。
盡管ASCII標準使得只含有ASCII字符的文本文件可以在Unix、Macintosh、Microsoft Windows、DOS和其它操作系統(tǒng)之間自由交互,但是在這些操作系統(tǒng)中,換行符并不相同,處理非ASCII字符的方式也不一致。換行(end-of-line, EOL)是一種加在文字字符最后位置的特殊字元,它可以確保后面的下一個字符能夠出現(xiàn)在下一行。ASCII編碼分別使用LF(Line Feed, 0Ah)或CR(Carriage Return, 0Dh)或CR+LF來表示換行(EOL),不同的操作系統(tǒng)處理EOL的方式如下:
LF:用于Unix或Unix相容系統(tǒng)(GNU/Linux, Mac OS X….),RISC OS;CR:Apple Ⅱ家族;CR+LF:Windows系統(tǒng),大部分非Unix操作系統(tǒng)。LabVIEW中的文本文件讀寫采用圖 1所示的兩個函數(shù)完成:“Write To Text File”和“Read From Text File”。這兩個函數(shù)是多態(tài)函數(shù),可以接受File Refnum和File Path兩種輸入。
圖 1 File I/O選板
本例將從一個數(shù)據(jù)讀寫的實例中介紹這兩個函數(shù)的使用。如圖 2所示,程序?qū)⒁粋€二維數(shù)組轉(zhuǎn)換為字符串后寫入到文本文件中,將會自動生成該Test.xls文件(如果已經(jīng)存在該名稱的文件,將自動覆蓋并不提示用戶)。盡管例子的后綴名使用xls(Microsoft Excel格式),但是實質(zhì)上是文本文件,使用各種文本編輯工具均可以打開(事實上也可以采用任何自定義格式的后綴名)。
圖 2 Write to Text File
如果需要將現(xiàn)有的數(shù)據(jù)添加到原有的文本文件中,應該如何處理呢?如圖 3所示,打開文件后使用Set File Position將文件指針移動到文件尾,再寫入數(shù)據(jù),并關(guān)閉文件。
圖 3 Write to Text File_Append
對比圖 2和圖 3,可以看出,盡管都使用了Write To Text File函數(shù),但是二者的輸入是不一樣的,前者使用路徑而后者使用Refnum。此外,前者只使用了一個函數(shù);而后者還加入了Close File函數(shù)。事實上,當使用文件路徑(Path)直接連入(或者為空,此時將彈出路徑選擇對話框)到Write To Text File函數(shù)中時,LabVIEW將在執(zhí)行完該函數(shù)時自動文件;但是如果是使用文件句柄(Refnum)連入到該函數(shù)或者將函數(shù)的輸出句柄連接到了其它的函數(shù),則LabVIEW將認為文件仍然在使用,并不自動關(guān)閉。
右擊Write To Text File函數(shù),在彈出菜單中有一個“Convert EOL”菜單項,默認是選中的。當勾選了該選項后,該函數(shù)將把所有基于操作系統(tǒng)的EOL字符(行結(jié)束符)轉(zhuǎn)換為LabVIEW EOL符。比如會將單獨的“”和“”轉(zhuǎn)換成“”行結(jié)束符。
圖 4顯示了從Test.xls中讀取數(shù)據(jù)的實例代碼,使用Read from Text File函數(shù)能夠?qū)⑽谋疚募械淖址x取,程序員可以對這些字符串進行后續(xù)的處理,如圖中轉(zhuǎn)化為Double數(shù)組。事實上,Read from Text File也能夠接受路徑和文件句柄兩種輸入方式,當需要只讀取文件的部分字節(jié)時就需要使用到句柄操作了。
圖 4 Read from Text File
Read from Text File函數(shù)有一個count輸入,表示從文本文件中讀取的字節(jié)數(shù)(byte),當設置為-1時表示整個文本。此外,在函數(shù)的右鍵快捷菜單中選擇“Read Lines”將以行為單位(而不是字節(jié))讀取文本文件。Read from Text File函數(shù)同樣也提供了“Convert EOL”選項,此時該函數(shù)將把所有基于平臺的行結(jié)束符轉(zhuǎn)換為換行符,如將“”和“”轉(zhuǎn)換為“”。
【注意】
從Read from Text File函數(shù)的count端子可知,該端子為一個I32型整數(shù)。當將其它類型的整數(shù)連入到該端子時,將自動轉(zhuǎn)換為I32型整數(shù)。如果文件過大,超過了I32的表示范圍,需要分段讀取。
【討論】如何將一個文本文件的內(nèi)容清空,但是不要將該文件刪除呢?
這個問題似乎是程序員經(jīng)常遇到的,一個簡單的方式就是使用“Open/Create/Replace File”函數(shù),將operation參數(shù)設置為replace and create。但是如果在使用文件的過程中,如何將文件內(nèi)容清空呢?如圖 5所示。
圖 5 清空已寫入文件的文本
當然可以先將該使用“Close File”函數(shù)關(guān)閉該文件,再使用“Open/Create/Replace File”函數(shù)新建該文件。此外,LabVIEW提供了一種字節(jié)控制的方式能夠迅速地清空文件中的內(nèi)容,如圖 6所示。
圖 6 使用Set File Size函數(shù)
毫無疑問,文本文件在數(shù)據(jù)存儲方面是非常重要的。通用、簡單和易用似乎是最大的優(yōu)勢,這一點從上面的實例中就可以看出來。但是,從測試測量的數(shù)據(jù)存儲方面來說,它也有一些缺點。如讀寫速度比較慢慢,不適合于高速數(shù)據(jù)記錄;文件取址和檢索比較麻煩,無法實現(xiàn)快速定位;當數(shù)據(jù)量太大時,打開文本文件會非常慢。此外,文本文件無法存儲顏色、富文本、圖像和視頻等多媒體信息。