2022年文件输入输出宣贯 .pdf
第 10 章 文件输入输出10.1 LabVIEW的文件输入输出简介10.1.1 LabVIEW的文件输入输出基本操作10.1.2 LabVIEW输入输出文件的格式10.1.3 参考数10.2 LabVIEW的文件输入输出函数和VI 10.3 文本文件的输入输出10.4 电子表格格式的文本文件的输入输出10.5 二进制文件的输入输出10.5.1 使用高层VI 保存二进制文件10.5.2 使用低层函数保存二进制文件10.5.3 读取二进制文件在这个程序中,10.5.4 二维数组二进制输入输出10.6 数据记录文件输入输出10.6 波形文件输入输出名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - 第 10 章 文件输入输出10.1 LabVIEW的文件输入输出简介10.1.1 LabVIEW 的文件输入输出基本操作LabVIEW的文件输入输出操作包括三个基本步骤:打开一个已存在的文件或创建一个新文件;对文件读或写;关闭文件。除此之外, LabVIEW 的文件操作还包括以下几个方面的内容:文件或路径的改名与移动改变文件特征创建、修改与读取系统设置文件记录前面板对象数据10.1.2 LabVIEW 输入输出文件的格式LabVIEW支持 4 种格式的文件。1. 文本文件这种格式的文件是ASCII 码字节流,可以用字处理软件或电子表格程序,例如word或 excel 来读取或处理数据。大部分仪器控制命令也是使用文本字符串。它的缺点是所占的磁盘空间大,存取速度慢。例如,对于一个浮点数123.4567,如果按一个单精度浮点数存储,只占用4 个字节;但是如果按ASCII 码字符串存储,因为它有 9 个字符,就需要占用9 个字节。此外,对于文本文件,不能随机的访问其中的某个数据。虽然文本文件中每个字符正好占一个字节,但是不同的数字占用字节数是不同的。这样要找到文件中某个位置上的数据,就得把它前面的数据都读出来,并且转换为数字,才能找到需要的数据。文本文件读写过程中由于存在着十进制 文本文件 二进制的转换问题,还有精度损失的问题。2. 二进制文件这是存取速度最快,格式最紧凑的数据存储方式。存取二进制格式文件必须把数据转换为二进制字符格式,并且必须准确掌握存取数据所用的数据类型。二进制格式的数据文件使用固定的字节长度存储1 到 4,000,000 之间的任何一个数据,这样节省了存储空间,还可以随机的访问文件中任何一个数据。有许多种数据类型都可以存为二进制格式的文件,但是它们不能通用。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - 3. 数据记录文件这也是二进制格式文件,但是只有G 语言可以读取或处理。数据记录文件类似于数据库文件,因为它以记录的形式存放数据,一个记录中可以存储几种不同类型的数据。向数据记录文件写数据时,每一个记录就是一个簇。不仅可以在图形代码中访问数据记录文件,还可以在前面板上访问它。4. 波形数据文件这种文件包含了波形数据特有的一些信息,例如采样起始时间、采样间隔等。10.1.3 参考数参考数 refnum 是一种数据类型。每当打开一个文件,G 语言就返回一个与此文件相联系的参考数。对于打开的文件的各种操作、当前读文件的位置、其它用户访问文件的权限等许多信息都用参考数来标识。参考数只在文件打开时是有效的。文件关闭以后, G语言就取消参考数与文件的联系。此后如果再次打开这个文件,G 语言返回一个新的参考数,很可能与上次使用的参考数不同。如果多次打开一个文件,每次打开都会返回一个不同的参考数。10.2 LabVIEW的文件输入输出函数和VI LabVIEW 提供了一套功能强大而又方便灵活的文件操作函数和VI ,它们位于File I/O 子模板和 WaveformWaveform File I/O子模板 ,分别用于数据文件操作和波形文件操作。图 10-1 LabVIEW 的文件输入输出函数子模板LabVIEW的文件输入输出函数大体上分为三个层次。1高层的文件操作高层文件操作VI 建立于低层函数之上,与错误检查和处理相结合,执行打开或创建高层文件操作VI 低层文件操作函数高级文件操作函数二进制文件操作VI 子模板名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 14 页 - - - - - - - - - 文件,读或写文件,关闭文件的全部过程。这一组VI 包括:写电子表格格式文件VI Write to Spreadsheet File。读电子表格格式文件VI Read from Spreadsheet File。写字符串文件VIWrite Characters to File 。读字符串文件VIRead Characters from File 。按行读字符串文件VI Read lines from File 。以下 VI 位于二进制文件操作子模板Binary File VIs 。读 16 位整型数文件VIRead from I16 File 。写 16 位整型数文件VIWrite to I16 File 函数。读单精度浮点数文件VI Read from SGL File 。写单精度浮点数文件VI Write to SGL File 。2. 常用的低层文件操作函数和VI 打开 /创建 /替换文件VI Open/Creat/Replace File 读文件函数 Read File。写文件函数 Write File 。关闭文件函数 Close File 。3.用到的可能性比较大的高级文件操作函数打开文件函数 Open File。创建新文件函数New File 。访问权限设置函数Access Rights。移动文件或路径函数Move。复制文件或路径函数Copy。删除文件或路径函数Delete。创建新路径函数New Directory 。4. 波形文件操作VI 它们也应归于高层文件操作VI,包括:写波形文件VIWrite Waveforms to File 。读波形文件VIRead Waveforms From File 。输出电子表格格式文件VI Export Waveforms to Spreadsheet File 。图 10-2 LabVIEW 的波形文件输入输出函数子模板名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 14 页 - - - - - - - - - 10.3 文本文件的输入输出保存文本文件首先要将数据转换为字符串。1. 使用高层 VI 保存文本文件图 10-3 高层 VI 保存文本文件在图 10-3 的图形代码中, 程序每循环一次产生一个随机数;用格式化字符串的Format into String VI将这个随机数与幅值相乘的结果转换为字符串;Format into String VI的格式化字符串参数format string设置为 %.3f (f 后面键入 2个空格 ,表示转换后保留3 位小数,每个数后留2 个空格)。最后使用写字符串文件的Write Characters to File VI把合成的字符串保存到C 盘根目录下,file 文件夹里,名为f1 的文件中。 Write Characters to File VI的 append to file? 参数在程序中被设置为T,即如果系统中没有这个文件就建立这个文件,如果存在这个文件就向文件后面追加数据。运行这个程序后,用Windows 的记事本程序打开C 盘根目录下file 文件夹中名为f1的文件,会看到一些带3 位小数的数字字符,每两个字符之间隔两个空格。由于 Write Characters to File VI是一个高层的文件操作VI ,每调用它一次, 都执行打开文件、写文件、关闭文件的操作,所以如果需要向文件中连续写数据,这样做效率是很低的。下面的程序使用低层文件操作函数完成同样的任务,但是可以极大的提高效率。2. 使用低层函数和VI 保存文本文件图 10-4 的程序调用了低层文件操作VI Open/Creat/Replace File,这个 VI 的文件路径参数 file path 如果不连接,则程序运行后弹出一个对话框询问操作者保存文件的路径和名称。程序中连接了这个参数, 并且将这个函数的功能参数function 设置为 open or create。这样程序开始运行时,先在C 盘根目录下file 文件夹中创建一个名为f2 的文件;如果这个文件已经存在就打开它。Open/Creat/Replace File VI 返回一个参考数refnum,标识打开的文件。写文件函数Write File 的位置模式参数pos mode 设置为 end ,使得新的数据追加在文件末尾。按下停止键后程序退出循环,调用关闭文件函数Close File 关闭文件。如果程序运行中出现错误, 最后简单错误处理VI Simple Error Handler .vi 会弹出一个对话框名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - 提示操作者。图 10-4 低层函数和 VI 保存文本文件在这个程序执行过程中,文件一直处于打开状态,避免了每次写文件前后程序都要与计算机操作系统交互操作去打开文件和关闭文件。这样提高了程序执行的效率。这种方式叫做磁盘流技术。3. 读取文本文件中的数据图 10-5 读取文本文件的数据图 10-5 的程序调用了高层文件操作VI Read Characters from File 读取文本文件中的数据。这个 VI 的输入参数由操作者在前面板进行设置。文件路径与文件名file path 参数如果不输入,则弹出一个对话框向操作者询问;读取数据点数number of characters参数确定每次读取的字符数;开始读数位置start of read offset 参数决定由第几个字符开始读数。Stringstring/Number Conversion函数子模板的字符串转换数据函数Fract/Exp String to Number 将每次读出的字符串最前面能够转换为有意义数据的一部分转换为一个浮点数。例如,数据字符串中第一个空格前或第二个空格(字符串开始于一个空格时)前的一部分。可以想象,这种方法可以将数据文件中所有字符都转换为数据。这个程序每读一次数据后就处于等待状态,如果按下继续键后就再次读数,如果按下停止键就退出循环。这个程序同样存在每次读数都要打开和关闭文件的问题,要避免这个问题,就使用低层函数。10.4 电子表格格式的文本文件的输入输出1写电子表格格式的文件电子表格格式的文件是一种特殊的文本文件,为了便于像Excel 这样的电子表格程序名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 14 页 - - - - - - - - - 对文件进行访问,文件对格式做了一些要求,例如用制表位符号做列标记、用行尾符号做行标记。图 10-6 低层函数和 VI 保存电子表格格式文本文件图 10-6的程序与图10-4的程序不同之处只在于保存文件输入的字符串中加入了制表位符号 Tab Constant 和行尾符号End of Line Constant 。程序运行结束后,在C 盘根目录下file 文件夹中生成名为c1 的电子表格文件。打开这个文件,在Excel 程序中可以看到两列数据,一列序号,另一列是随机数。图 10-7 高层 VI 保存电子表格格式文本文件如果保存数据并不频繁,为了编程简便,可以使用高层VI ,写电子表格格式文件的VI Write to Spreadsheet File 保存电子表格格式的文件。图 10-7 的程序运行后得到的结果与图10-6 的程序完全相同。2读电子表格格式的文件图 10-8 的程序调用了高层文件操作VI Read from Spreadsheet File 读取电子表格文件中的数据。 读取图 10-6 或图 10-7 的程序保存的数据时,由于数据存为2 列,所以如果用 Graph 显示读取的数据,需要将Graph 设置为Transpose Array ,或者将 Read from Spreadsheet File VI 的转换参数Transpose设置为 T。Read from Spreadsheet File VI另一个需要注意的参数是定界符delimiter ,它的默认值是制表位Tab,如果文件中用了不同的定界符,应进行这个参数的设置。图 10-8 读取电子表格文件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 14 页 - - - - - - - - - 10.5 二进制文件的输入输出10.5.1 使用高层 VI 保存二进制文件LabVIEW 在二进制文件函数子模板Binary File VIs 中提供了 4 个二进制文件操作VI,分别用于进行16 位整型数和单精度浮点数文件操作。图10-9 的程序用 Write to SGL File VI 将一个周期的正弦波数据保存为一个单精度浮点数文件。图 10-9 高层函数保存二进制文件在这个程序中,产生数据用的是AnalyzeSignal ProcessingSignal Generation子模板中的 Sine Wave VI , 由于这个函数产生的是双精度浮点数,所以用 NumericConversion 函数子模板中的To Single Precision Float 函数将其转换为单精度浮点数。如果需要保存其它数据类型的二进制数据文件,或想要得到更高的存储效率,就要用低层函数和VI 。10.5.2 使用低层函数保存二进制文件图 10-10 的程序与图10-4 的程序区别仅在于Write File 函数的 data 参数输入的数据类型不同。 由于 data 参数具有多义性的特点,所以图 10-4 的程序输入一个字符串,Write File 函数就写一个文本文件;图10-10 的程序输入一个双精度浮点数数组,则Write File函数就写一个二进制文件。图 10-10 低层函数和VI 保存二进制文件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 14 页 - - - - - - - - - 图 10-11 高层 VI 读取二进制文件10.5.3 读取二进制文件图 10-11 的程序调用了高层文件操作VI Read from SGL File 。这个 VI 可以读取单精度浮点数的一维数组或二维数组。读二维数组时需要连接二维数组行数2D number of rows 这个参数,而现在连接读取数据点数的这个参数2D number of columns/1D count 应连接读取的二维数组列数。图 10-12 是使用低层函数和VI 读取二进制文件的程序。图 10-12 低层函数读取二进制文件在这个程序中, Open/Creat/Replace File VI 函数返回一个用字节数表示文件大小的参数 file size,因为 LabVIEW 用 8 个字节存储1 个双精度浮点数,所以 file size 除以 8 的商的整数部分就是文件中包含的双精度浮点数个数。用 Quotient & Remainder 函数求得这个数,作为 Read File 函数的读取数据量参数count 的输入。这样设置即一次读出文件中所有的数据。 Read File 函数的数据类型参数byte stream type 在这里输入了一个双精度浮点数,这里需要的是它的数据类型而不是它的数值。Data 参数按照它的数据类型读取文件并返回数据。10.5.4 二维数组二进制输入输出名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 14 页 - - - - - - - - - 图 10-9 和图 10-10 的程序保存的都是一维数组的数据,读取也比较容易。 但是如果在图 10-10 的程序中给Write File 函数的 data 参数输入一个二维数组,而不做其它改变,则数据就不能够正确的读出。因为Write File 函数只是简单的把数据逐个字节写入文件,并不附加任何行与列的信息。例如,即使我们知道文件中存储了48 个字节双精度浮点数,我们也只能确定文件中有48/8=6 个数据;至于这是个包含6 个元素的一维数组,还是包含 3 行 2 列的二维数组,或包含2 行 3 列的二维数组,就无从知晓了。因此在保存二维数组数据的二进制文件时必须加上文件头信息。图 10-13 添加文件头信息的方法1 图 10-13 的程序给 Write File 函数的文件头参数header输入一个 T 值, 这样 Write File函数在写文件时就自动加上文件行列信息。这两个 32 位整型数使存储的文件多出8 个字节。这是添加文件头信息的最简单方法。图 10-14 添加文件头信息的方法2图 10-14 的程序调用了AdvancedData Manipulation 函数子模板的Flatten to String 函数。这个函数将输入数据转换为二进制字符串并加上文件头信息。图 10-15 添加文件头信息的方法3 图 10-15 的程序索引出数组的行列值,分别调用Write File 函数写入文件。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 14 页 - - - - - - - - - 以上 3 种方法保存的文件都可以用图10-16 的程序读出。这里为Read File 函数的数据类型参数byte stream type 输入了空的一个双精度二维数组。返回值 data 是一个与存储数据完全相同的二维数组。图 10-16 读取二维数组的数据文件10.6 数据记录文件输入输出需要在一个文件中记录多种类型的数据时,尽管有多种方法可以将这些数据转换为同一种类型,然后存储为文本文件或二进制文件,但是这样做通常是很麻烦的。例如,将一个二维数组转换为电子表格格式的字符串,并带着文件头和时间标记,是一项非常复杂的操作,而且数字型数据和字符串之间的转换很费时间。LabVIEW 提供了一种叫做数据记录 datalog 格式的文件来解决这个问题。数据记录文件类似于数据库文件,将数据存储为记录的序列,各个记录的数据类型一致,但是每个记录中可以是任意类型数据的组合。每个记录实际就是一个簇,例如,这个簇由一个字符串、一个数值和一个数组构成。如图10-17 所示。图 10-17 数据记录LabVIEW按记录由数据记录文件中索引数据,它自动为每个数据记录文件保存每个记录的数据量。这样简化了数据的读取,因为可以按原来的数据分块把一个记录读回来,而不需要知道一个记录包含多少字节的数据。如果不需要用其它软件读取存储的数据,把数据存入数据记录文件是一种很好的选择,按这种形式把数据写入文件只需要很少的操作,使得读写文件非常快捷。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 14 页 - - - - - - - - - 图 10-18 的程序将图10-17 的数据保存为一个数据记录文件。这个程序调用了高级文件操作函数New File,用它创建一个新文件。当程序中为这个函数的数据记录类型参数datalog type 连接一个值的时候,它就产生一个数据记录文件。数据记录文件中每个记录的数据类型都与datalog type 的数据类型一致。图 10-18 写数据记录文件图 10-19 读数据记录文件图 10-19 的程序可以将图10-18 的程序保存的数据记录文件读出。这里调用了高级文件操作函数Open File,用它打开一个文件。当程序中为这个函数的数据记录类型参数datalog type 连接一个值的时候,它就打开一个数据记录文件。如果 datalog type 参数的数据类型与数据记录文件中的数据类型不匹配时,程序运行后不能读出数据,并返回一个数据类型冲突的出错信息。图 10-20 读取的数据记录图 10-20 是图 10-19 的程序读出的数据。Graph 中的曲线是用Unbundle By Name 函数从读取的数据中解析出的采样数据。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 14 页 - - - - - - - - - 10.6 波形文件输入输出波形文件实际上也是一种数据记录文件。波形文件由记录组成,每个记录中可以有一个或多个波形的数据。一个波形包括采样开始时间t0,采样间隔dt 和采样数据y(一个数组 )三部分信息。LabVIEW 的波形文件操作VI 从功能上看类似于高层文件操作VI,它执行打开或创建文件、读或写文件、关闭文件的全部操作过程。图 10-21 保存波形文件图 10-21 的程序调用WaveformWaveform Generation 函数子模板的正弦波VI Sine Waveform 生成波形数据,关于波形的频率、幅值、采样率、采样数等参数在程序的前面板上设定。然后调用WaveformWaveform File I/O 子模板的写波形文件VI Write Waveforms to File 生成一个波形文件, 并且将波形数据写进文件,最后关闭这个文件。 Sine Waveform VI 的 append to file?参数在程序中设置为T, 这样用户指定的文件名已经存在,就向这个文件后面追加数据。图 10-22 保存波形文件图 10-22 的程序调用WaveformWaveform File I/O 函数子模板的读波形文件VI Read Waveform from File 读取波形数据,用Graph 显示在前面板上。如果保存波形数据时只存储了一个波形,或只需要读出存储的波形数据中第一个波形,就连接Read Waveform from File VI 返回的 first waveform in record参数,这样就只读出第一个波形;如果保存波形数据时存储了一个波形数组,波形文件中有多个波形数据时,要全部读出这些波形,就连接all waveforms in record 这个参数。读出全部波形后可以一起显示在Graph 上,也可以用索引数组函数Index Array 索引出其中某一个波形进行分析处理。对名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 14 页 - - - - - - - - - 于一个波形还可以用取波形成员函数Get Waveform Components 解析出其中某个成员。练习与思考:10.1 产生若干个周期的正弦波数据,以当前系统日期和自己的姓名为文件名,分别存储为文本文件、二进制文件、和电子表文件。10.2 分别用 Windows记事本、 Excel 和 LabVIEW程序将习题10.1 存储的数据文件读出来。10.3 将一组随机信号数据加上时间标记存储为数据记录文件,然后再LabVIEW程序将存储的数据读出并显示在前面板上。10.4 产生矩形脉冲数据并记录为波形文件。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 14 页 - - - - - - - - -