计算机仿真技术与CAD
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.7 MATLAB的文件I/O

在MATLAB中,提供了许多有关文件的输入和输出函数,它们具有直接对磁盘文件进行访问的功能,使用这些函数可以很方便地实现各种格式的读取工作,不仅可以进行高层次的程序设计,也可以对低层次的文件进行读写操作,这样就增加了MATLAB程序设计的灵活性和兼容性。

1.7.1 处理二进制文件

对于MATLAB而言,二进制文件是相对比较容易处理的。和后面介绍的文本文件相比较,二进制文件是比较容易和MATLAB进行交互的。

对于和MATLAB同等层次的文件,可以使用load、save等命令对该文件进行操作,具体的操作方法前面已经介绍过。这里主要介绍在MATLAB中读取低层次数据文件的方法,这些函数可以对多种类型的数据文件进行操作,常用的函数如表1-11所示。

表1-11 二进制文件I/O函数

1.文件的打开和关闭

在对文件进行处理的所有工作当中,打开文件或者关闭文件都是十分基础的工作。

MATLAB利用函数fopen()打开或获取低层次文件的信息,该函数的调用格式为

[fid,message] =fopen(′filename′,′mode′)

其中,filename表示打开的文件名;mode表示打开文件的方式,其中“r”表示以只读方式打开,“w”表示以只写方式打开,并覆盖原来的内容,“a”表示以增补方式打开,在文件的尾部增加数据,“r+”表示读写方式打开,“w+”表示创建一个新文件或删除已有的文件内容,并进行读写操作,“a+”表示以读取和增补方式打开;message为打开文件的信息;fid为文件句柄(或文件标识),如果该文件存在,则返回的文件句柄fid的值为非-1,以后就可以对该句柄指向的文件进行直接操作了,如果该文件不存在,则返回的句柄值为-1,但不会中断运行。

在默认的情况下,函数fopen()会选择使用二进制的方式打开文件,在该方式下,字符串不会被特殊处理。如果用户需要用文本形式打开文件,则需要在上面的mode字符串后面填加“t”,例如,“rt”、“rt+”等。

在打开文件后,如果完成了对应的读写操作,应该利用fclose()函数来关闭该文件,否则打开过多的文件,将会造成系统资源的浪费。该函数的调用格式为

status=fclose(fid)

其中,fid为使用fopen()函数得到的文件句柄(或文件标识);status为使用fclose()函数得到的结果,如status=0表示关闭文件的操作成功,否则得到的结果为status=-1。

例如用户想新建一个名为myfile.txt的文件,对其进行读写操作,则可以利用以下MAT-LAB命令

      >>[myfid,message] =fopen(′myfile.txt′,′w′)

结果显示:

      myfid=
            3
      message=
              ′′

完成了对该文件的读取操作后,用户可以调用fclose(myfid)命令来关闭该文件。

2.读取M文件

常见的二进制文件包括.m、.dat等文件,在MATLAB中可以使用fread()函数来读取对应的文件,该函数的调用格式为

[A,count] =fread(fid,size,′precision′)

其中,fid为打开文件的句柄;size表示读取二进制文件的大小,其中当size为n时表示读取文件前面的n个整数并写入到向量中,size为inf时表示读取文件直到结尾,size为[m,n]时表示读取数据到m ×n矩阵中(按照列排列,仅n可以为inf)”;precision用来控制二进制数据转换成为MATLAB矩阵时的精度,如可取precision为uchar、schar、int8、int16、int32、int64、uint8、uint16、uint32、uint64、single、float32、double或float64;A为存放数据的向量或矩阵;count表示A中存放数据的数目。

例1-36】 利用函数fread()读取M文件的内容。

首先利用MATLAB的M文件编辑器编写具有以下内容的M文件,并将其以ex1_36.m保存。

            a=3;b=6;c=a*b

然后利用以下MATLAB命令读取该文件

      >>fidex1_36=fopen(′ex1_36.m′,′r+′);A=fread(fidex1_36)

结果显示:

      A=
        97
        61
        …
        13
        10

从上面的结果可以看出,尽管打开的文件中是程序代码,但是使用fread()读取该文件后,得到的却是数值数组。

利用以下命令可以得到该文件的程序代码

      >>disp(char(A′));

结果显示:

      a=3;b=6;c=a*b

从结果的角度来看,上面的命令代码和“type ex1_36.m”是相同的,相当于将该文件中的所有代码都显示出来。

3.读取TXT文件

TXT文件也是比较常见的二进制文件,以下通过一个简单的例子来介绍如何在MATLAB中读取TXT文件。

例1-37】 在MATLAB中读取ex1_37.txt文件的内容。

首先将以上M文件ex1_36.m更名为ex1_37.txt,然后利用以下MATLAB命令

      >>fidex1_37=fopen(′ex1_37.txt′,′r′);A=fread(fidex1_37,′*char′);sprintf(A)

结果显示:

      ans=
          a=3;b=6;c=a*b

或利用命令

      >>fidex1_37=fopen(′ex1_37.txt′,′r′);A1=fread(fidex1_37,9,′*char′);
      >>A2=fread(fidex1_37,5,′*char′);A3=fread(fidex1_37,4,′*char′);
      >>A4=fread(fidex1_37,6,′*char′);sprintf(′%c′,A1,A2,′+′,A3,′+′,A4)

结果显示:

      ans=
          a=3;b=6;c=a*b

4.写入二进制文件

在MATLAB中,如果用户希望按照指定的二进制文件格式,将矩阵的元素写入文件中,可以使用函数fwrite()来完成。该函数的调用格式为

fwrite(fid,A,′precision′)

其中,fid为打开文件的句柄;A表示写入数据的向量或矩阵;precision用来控制二进制数据转换成为MATLAB矩阵时的精度。

例1-38】 在MATLAB中使用函数fwrite()来写入二进制文件。

MATLAB命令为

      >>fidex1_38=fopen(′ex1_38.txt′,′w′);A=[1 2 3;4 5 6]
      >>fwrite(fidex1_38,A,′int32′);fclose(fidex1_38);
      >>fidex1_38=fopen(′ex1_38.txt′,′r′);B=fread(fidex1_38,[2,3],′int32′),fclose(fidex1_38);

结果显示:

      A=
        1    2    3
        4    5    6
      B=
        1    2    3
        4    5    6

1.7.2 处理文本文件

MATLAB的数据I/O操作支持多种数据格式,包括:文本数据、图形数据、音频和视频数据、电子表格数据和科学数据。针对不同数据类型的数据文件,提供了多种处理函数,分别用于处理各种格式的数据文件。其中文本文件的读取函数如表1-12所示。文本文件中数据是按照ASCII码存储的字符或数字,它们可以显示在任何文本编辑器中。

表1-12 文本文件I/O函数

1.读取文本文件

在MATLAB中,提供了多个函数来读取文本文件中的数据,其中比较常见的函数有csvread()、csvread()和csvread(),这些函数有各自的使用范围和特点。它们的调用格式分别为

                          A=csvread(′filename′,row,col)
                          A=dlmread(′filename′,delimiter)
                          A =textread(′filename′,′format′,N)

其中,filename为打开的文本文件名;row和col分别为需要读取的数据行和列;delimiter为用户自定义的分隔符;fp为打开文件的句柄;format表示读取文件的变量格式;N表示读取数据的循环次数;A表示存放数据的向量或矩阵。

2.写入文本文件

利用函数csvwrite()、csvwrite()和csvread()可将数据写入文本文件,它们的调用格式分别为

csvwrite(′filename′,A,row,col)

dlmwrite(′filename′,A,′-append′,delimiter)

其中,filename为数据写入的文本文件名;A表示写入数据存放的向量或矩阵;row和col分别表示在原始数据基础上添加的数据行和列数;delimiter为用户自定义的分隔符;fp为打开文件的句柄;format表示读取文件的变量格式;N表示读取数据的循环次数。

例1-39】 在MATLAB中使用函数csvwrite()或dlmwrite()来写入文本文件。

MATLAB命令为

      >>A=[1 2 3;4 5 6];csvwrite(′ex1_39.dat′,A);type ex1_39.dat
      >>B=csvread(′ex1_39.dat′),C=dlmread(′ex1_39.dat′)

      >>A=[1 2 3;4 5 6];dlmwrite(′ex1_39.txt′,A);type ex1_39.txt;
      >>B=csvread(′ex1_39.txt′,0,0),C=dlmread(′ex1_39.txt′)

结果显示:

      1,2,3
      4,5,6
      B=
        1    2    3
        4    5    6
      C=
        1    2    3
        4    5    6