1
第五章 字符串和文件 I/O
5.1 字符串
字符串是 ASCII 字符的集合。如同其他语言一样,LabVIEW 也提供了各种处理字符串的
功能,如果想获得字符串的例子,可查看 Examples\General\strings.llb。下面扼要介绍
一些内容。
创建字符串控制对象和显示对象
可以在 Controls»String & Table 中看到右边
所显示字符串控制对象和显示对象。还可以使用操
作工具或者标签工具输入或者改变字符串控制对象
中的文本。用移位工具拖曳字符串控制对象和显示对象的边角可
以增大它们的面积。
在这里输入文本
字符串control
练习 5-1 组合字符串
目的:使用一些字符串功能函数将一个数值转换成字符串,并把该字符串和其他一些字符串
连接起来组成一个新的输出字符串。
前面板
打开一个新的前面板,按照下图向其中添加对象。
SET
Header
VOLTS
Trailer
5.50
Number
SET 5.5000 VOLTS
输出字符串
16
输出串长度
其中的两个字符串控制对象和数值控制对象可以合并成一个输出字符串并显示在字符
串显示器中。数值显示器显示出字符串的长度。
本练习中输出字符串是一个 GPIB(IEEE 488)命令字符串,它可用来与和串口仪器
(RS-232 或者 RS-422)进行通信。
流程图
Format Into String 函数(Functions»String)——在本练习中,它用于对
2
数值和字符串进行格式化,使它们成为一个输出字符串。用变形工具可以添加三个加和
输入。
String Length 函数(Functions»String)——在本练习中,它用于返回一
个字符串的字节数
执行该 VI。注意,Format Into String 功能函数将两个字符串控制对象和数值控制对象
组合成一个输出字符串。
把该 VI 保存为 Build String.vi,在下一个练习中还将用到这个 VI。
字符串格式的设定:选中 Format Into String 函数,单击右键,在快速菜单中选择 Edit
Format String,可分别对个输入的各部分格式做设定。
练习 5-1 结束。
练习 5-2 字符串子集和数值的提取
目的:创建一个字符串的子集,其中含有某个数值的字符串显示,再将它转换成数值。
打开 Examples\General\strings.llb 中的 Parse String.vi。用默认输入值执行该 VI。注意,
DC的字符串子集被用于输入字符串。还要注意,字符串的数值部分被提取出来,并转换为
数值。您可以尝试使用不同的控制数值(记住数组式的字符串是从 0 开始进行编号),或者
您可以返回到流程图,查看怎样从输入字符串中提取出其中的元素。
String Subset 函数(Functions»String)——在本练习中,它用于返回偏移地址开始
的子字符串以及字节数。第一个偏移地址是 0。
很多情况下,必须把字符串转换成数值,例如需要将从仪器中得到的数据字符串转换成
数值。
Scan From String 函数(Functions»String)——在这个例子中,它用于扫描字
符串,并将有效的数值(0 到 9,正负,e,E 和分号)转换成数值。如果连接了一个
格式字符串,它将根据字符串指定的格式进行转换,否则将进行默认格式的转换。
该函数从偏移地址的 string 处开始扫描。第一个字符的偏移地址是 0。这个函数在已知头长
度(本例中是 VOLTS DC)时或者字符串只含有有效字符时很有用。
选择 File»Close,关闭该 VI。注意不要保存它。
练习 5-2 结束。
5.2 文件的输入/输出(I/O)
3
文件 I/O 功能函数是一组功能强大、伸缩性强的文件处理工具。它们不仅可以读写数据,
还可以移动、重命名文件与目录。创建电子
格格式的、由可读的 ASCII 文本组成的文件,
以及为了提高读写速度和压缩率采用二进制的格式写入数据。
可以采用下面三种文件格式存储或者获得数据:
ASCII 字节流——如果希望让其他的软件(譬如字处理程序或者电子表格程序)也可以
访问数据,就需要将数据存储为 ASCII 格式。为此,您需要把所有数据都转换为 ASCII
字符串。
数据记录文件——这种文件采用的是只有 G 语言可以访问的二进制格式。数据记录文件
类似于数据库文件,因为它可以把不同的数据类型存储到同一个文件记录中。
二进制字节流——这种文件的格式是最紧凑、最快速地存储文件的格式。您必须把数据
转换成二进制字符串的格式,还必须清楚地知道在对文件读写数据时采用的是哪种数据
格式。
因为 ASCII 字节流格式是最常用的数据文件格式,所以本节着重介绍这种格式。如果您
想获得关于文件 I/O 的例子,请参考 Examples\File。
5.2.1 文件 I/O 功能函数
大多数的文件 I/O 操作都包括三个基本的步骤:打开一个已有的文件或者新建一个文
件;对文件进行读写;关闭文件。LabVIEW 在Functions» File I/O 中提供了很多有用的工
具 VI。本节主要介绍 9 个高级工具 VI,这些工具 VI 可以把错误检查和错误处理等功能与
文件 I/O 功能函数结合起来。
以下5个功能从左到右对应于上面5个图标。
Write To Spreadsheet File VI——用于将由单精度数值组成的一维或者二维数组
转换成文本字符串,再将它写入一个新建文件或者已有文件。该 VI 先打开或者新
建文件,之后再关闭文件。它可以用于创建能够被大多数电子表格软件读取的文本
文件。
Read From Spreadsheet File VI——用于从某个文件的特定位置开始读取指定个
数的行或者列内容,再将数据转换成二维、单精度数组。该 VI 先打开文件,之后
再关闭文件。它可以用于读取用文本格式存储的电子表格文件。
Write Characters To File VI——用于将一个字符串写入一个新建文件或者已有
文件。该 VI 打开这个文件、写入数据,再关闭文件。
Read Characters From File VI——用于从某个文件的特定位置开始读取指定个数
的字符。该 VI 先打开文件,之后再关闭文件。
Read Lines From File VI——用于从某个文件的特定位置开始读取指定个数的行
内容。该 VI 先打开文件,之后再关闭文件。
如果想查看其他的文件 I/O 功能函数,请选择Function»File I/O» Binary File VIs 或
者 Function»File I/O»Advanced File Functions。
5.2.2 将数据写入电子表格文件
将数据存储到文件的最常见应用之一是设置文本文件的格式以便在电子表格文件中打
开它。大多数电子表格文件用 Tab 键分割各列,而用 EOL(段尾)分隔各行,如下图所示。
4
用一个电子表格程序(如 Excel)打开该文件可以看到下面这个表格。
练习 5-3 将数据写入电子表格文件
目的:修改一个已有的 VI 以使用文件 I/O 功能函数,以便可以将数据以 ASCII 格式保存
到一个新的文件。然后就可以用一个电子表格程序打开该文件。
前面板
打开前面练习中创建的 Graph Waveform Arrays.vi。当调用这个 VI 时,该 VI 将产生
两个数据数组,并将它们绘制在一个图区中。您需要对该 VI 进行修改,从而把两个数组写
入一个文件,格式是每列含有一个数组。
-0.090
Array
1.5
-0.5
0.0
0.5
1.0
1000 10 20 30 40 50 60 70 80 90
Plot 0
Plot 1
Waveform Graph
don't transpose
transpose? (no:F)
流程图
打开 Graph Waveform Arrays.vi 的流程图,按照下图在流程图的右下角添加功能函数。
Write To Spreadsheet File VI (Functions»File I/O)用于将二维数组
转换成电子表格字符串,再将它写入一个文件。如果没有指定路径名称,
将会弹出一个文件对话框,提示输入文件名。该 VI 将把一维或者二维数组
写入文件。这个例子中,因为用的是二维数组,所以无需连接一维输入端子。
5
Boolean 常数 (Functions»Boolean)用于控制是否在写入数据之前转换成二维数组。
在这个例子中需要对数据进行转换。因为电子表格文件的每列都含有一个数据数组,所
以必须先转换成二维数组。
返回前面板,执行该 VI。数据数组产生以后,会出现一个文件对话框提示输入新建文
件的文件名。输入文件名,并单击 OK。
可以尝试选择转换与不转换两种情况运行程序,查看结果差别。
保存该 VI 为 Waveform Arrays to File.vi,并关闭该 VI。
现在可以用电子表格软件或者文本编辑器打开或者编辑刚才创建的文件。可以看到两列表
格,每列含有 100 个元素。
在这个例子中,直到所有数组都被采集以后,数据才可以被转换或者写入文件。如果需要更
大的数据缓存和希望在数据产生后把它们写入到硬盘,就需要使用另外一个文件 I/O VI。
练习 5-3 结束。
练习 5-4 向文件添加数据
目的:创建一个 VI,可以把温度数据以 ASCII 格式添加到某个文件中。该 VI 使用 For 循
环产生温度数据,并将它们存储到一个文件中。在每个循环期间,您都要把数据转换成字符
串,添加一个逗号作为分隔符,并将字符串添加到文件中。
前面板
打开一个新的前面板,并按照下图放置对象。
20
数据点个数
90.0
70.0
75.0
80.0
85.0
5939
84.96
温度 Chart
new file
append to file?
前面板中包括一个数字式显示器和一个波形图。“数据点个数”控制对象指定了需要采
集和写入文件的温度数据的数量。波形图表则用于显示温度曲线。将波形图表的 Y 轴范围设
置为 70.0 到 90.0,X 轴范围设置为 0 到 20。
6
流程图
打开流程图,添加 For 循环并增大它的面积。该 VI 将产生由“数据点个数”控制对象
指定的个数的温度数据。
在循环中加一个移位寄存器,方法是用鼠标右键单击循环边界,在快捷菜单中选择移位
寄存器。这个移位寄存器中将含有文件的路径名。
完成对象的连线。
Empty Path 常数(Functions»File I\O»File Constants)——用于初始化移位
寄存器,以保证需要对文件写入数据时路径都是空的。会出现一个文件对话框提
示输入文件名。
Digital Thermometer VI(Functions»Select a VI„)——返回一个模拟温
度测量值(仿真)。
Format Into String 函数(Functions»String)——将温度数据转换成字符
串,并且在数据后面增加一个逗号。
Write Characters To File VI((Functions»File I/O)——用于向文件写入
字符串。
Boolean 常数(Functions»Boolean)用于将 Write Characters To File VI 的 append to
file?输入为 TRUE, 这样在循环执行时新的温度数据就会加入到选中的文件中。用操作
工具单击这个常数可以将它设置为 TRUE。
返回前面板,把“数据点个数”设置为 20,执行该 VI。这时会出现一个文件对话框,
提示输入文件名。输入文件名以后,VI 就会在每个温度数据产生时,将它写入到该文
件中。
把该 VI 保存为 LabVIEW\Activity 目录下的 Write Temperature to File.vi。
使用任意一个字处理软件,例如 Write for Windows,Teach Text for Macintosh, 或
者 UNIX 平台下的某个文本编辑器,打开该数据文件查看其内容。您可以看到文件的内
容是 20 个用逗号分隔开的数值(准确到小数点后三位)。
练习 5-4 结束。
练习 5-5 从文件读取数据
目的:创建一个 VI,可以从上一个练习中创建的例子中读取数据,并把这些数据显示在一
个波形图形中。必须按照数据保存的格式来读取它,因为原来是用字符串数据类型,把数据
7
保存为 ASCII 格式,那么就必须用一个文件 I/O 函数把数据作为字符串读出。
前面板
打开一个新的前面板,并按照下图放置对象。
87.402344,
86.914062,
86.425781,
85.937500,
85.449219,
85.449219,
84.960937,
84.472656,
83.984375,
83.984375,
83.984375,
83.984375,
从文件读字符串
100.0
50.0
60.0
70.0
80.0
90.0
100 1 2 3 4 5 6 7 8 9
温度 Graph
前面板中包括一个字符串显示对象和一个波形图。“从文件读字符串“显示对象将从上个练
习创建的文件中读出用逗号分隔开的温度数据。波形图则用于显示温度曲线。
流程图
Read Characters From File VI(Functions»File I/O)——用于从文件中
读取数据,以及输入字符串中的信息。如果没有指定路径名称,将出现一个
文件对话框提示您输入文件名。在这个例子中,无需判断需要读取的字符的
个数,因为文件的字符数比默认的 512 要少。要从文件中读取数据,必须知道数据的存
储方式。如果知道了文件的长度,就可以使用 Read Characters From File VI 读取指
定个数的字符。
Extract Numbers VI (Examples\General\strings.llb)——用于提取由逗
号、分行符号、非数值字符等分隔开的数据组成的 ASCII 字符串,并将它
们转换成数值数组。
返回前面板,执行该 VI。将出现一个文件对话框,在其中选择刚才保存的数据文件,
您可以看到图形中显示的数据与 Write Temperature to File VI 例子中显示的一样。
保存该 VI 为 Temperature from File.vi,并关闭它。
练习 5-5 结束。
5.3 数据记录文件(datalog file)
上面提供的例子说明了处理 ASCII 字符格式存储的数据的文件的简单方法。在需要创建
供其他软件(如电子表格软件)访问的文件时这种方法很有用。另外一种是称为数据记录文
8
件(datalog file)的数据格式。它与数据库文件有类似之处,文件是由记录组成的,一个
文件的所有记录有相同的结构和长度。访问该文件是可以以记录为单位,并且可直接访问文
件中的任意一个记录。记录本身的数据结构可由用户自己定义,一个记录内可容纳不同的数
据类型,它就像一个簇一样。
如果要用 VI 获得数据,您可能不想把数据写入到 ASCII 文件中,因为把数据和字符串
之间相互转换非常花费时间。例如,把一个二维的字符转换成一个具有电子表格格式的字符
串(具有标题和时间标记)也是一个非常复杂的操作。如果不需要把文件存储成可供别的软
件访问的格式,您可以把数据输出到一个数据记录文件。使用这种格式时,把数据写入到文
件的操作变得非常简单,这也使得读写操作的速度更快。它还可以简化数据采集的工作,因
为您可以把初始的数据块作为一个日志或者记录读取,而无需了解其中含有多少数据。G 语
言会记录数据的数量,用于对每个数据记录文件的记录。
Write Datalog File 示例(位于 Examples\File\datalog.llb)创建了一个新的数据记录文
件,并把指定数目的数据写入该文件。每个记录都是一个由一个字符串和一个单精度数据数
组构成的簇。
要读取一个数据记录文件,您采用的格式必须与对该文件写入数据时所用格式相同。Read
Datalog File示例将从 Write Datalog File示例创建的数据记录文件中一次读取一个记录。
读出的每个记录都是一个由一个字符串和一个单精度数据数组构成的簇。