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