当前位置:文档之家› 实验八MATLAB文件操作与数据导入导出

实验八MATLAB文件操作与数据导入导出

实验八 Matlab 文件操作与数据接口一、实验目的1、熟练掌握工作区变量的文件操作;2、熟练掌握文本文件的读写操作;3、熟练掌握格式化文本文件的输入输出语句的执行4、了解二进制文件、Mat文件的读写操作二、实验仪器与软件1. PC计算机2. Matlab软件三、实验原理1. 二进制文件与文本文件的区别:将文件看作是由一个一个字节(byte) 组成的,那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。

这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。

如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII 码,而以按照二进制方式打开的话,则不会进行任何的translate;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。

譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bi t),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。

从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种:ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。

例如,数5678的存储形式为:ASCII码:00110101 00110110 00110111 00111000↓↓↓↓十进制码:5678共占用4个字节。

ASCII码文件可在屏幕上按字符显示,例如源程序文件就是A SCII文件,用DOS命令TYPE可显示文件的内容。

由于是按字符显示,因此能读懂文件内容。

二进制文件是按二进制的编码方式来存放文件的。

例如,数5678的存储形式为:00010110 00101110 只占二个字节。

二进制文件虽然也可在屏幕上显示,但其内容无法读懂。

Matlab 中存储成为二进制还是文本文件取决于fopen的方式,如果用wt,则存储为文本文件,这样用记事本打开就可以正常显示了;如果用w则存储为二进制文件,这样用记事本打开会出现小黑方块,要正常显示的话,可以用写字板或UltraEdit等工具打开。

2. MATLAB文件操作与数据导入导出2.1 文件的打开和关闭2.1.1 文件的打开无论是要读写ASCII码文件还是二进制文件,都必须先用fopen函数将其打开,在默认情况下,fopen以二进制格式打开文件,它的使用语法如下:fopen ('filename', 'mode')其中filename表示要读写的文件名称,mode则表示要对文件进行的处理方式,可以是表2-1中的任一字符串。

表2-1 文本文件打开的模式fopen函数有两个返回值,一个是返回一个文件标志(file Identifier),它会作为参数被传入其他对文件进行读写操作的命令,通常是一个非负的整数,可用此标识来对此文件进行各种处理。

如果返回的文件标识是–1,则代表fopen 无法打开文件,其原因可能是文件不存在,或是用户无法打开此文件权限。

另一个返回值就是message,用于返回无法打开文件的原因。

为了安全起见,最好在每次使用fopen函数时,都测试其返回值是否为有效值。

下面以脚本m文件为例来声明文件的打开。

例2-1 %exam1.m[f,message]=fopen('fileexam1', 'r')if f==-1disp (message); %显示错误信息end若文件fileexam1不存在,则显示如下信息。

Cannot open file.existence?permissions?memory?...例2-2 %exam2.m[f,message]=fopen('fileexam2', 'r');if f==-1disp (message); %显示错误信息elsedisp(f);end若文件fileexam2存在,则返回f值。

2.1.2 文件的关闭一旦完成文件的读写,最好关闭文件,以便对其进行其他操作。

这时就可以使用fclose函数来关闭文件,其适用语法如下。

fclose(f)其中f为打开文件的标志,若fclose函数返回值为0,则表示成功关闭f标志的文件;若返回值为–1,则表示无法成功关闭该文件。

一般来说,在完成对文件的读写操作后就应关闭它,以免造成系统资源浪费。

此外,需注意的是,打开和关闭文件都比较耗时,因此为了提高程序执行效率,最好不要在循环体内使用文件。

若要一次关闭打开的所有文件,可以使用下面的命令:fclose all2.2 文本数据虽然MATLAB自带的MAT文件为二进制文件,但为了便于和外部程序进行交换以及方便查看文件中的数据,也常常采用文本数据格式与外界进行数据交换。

在文本格式中,数据采用ASCII码格式,可以表示字母和数字字符。

2.2.1 从文本文件中读取数据1.使用导入模板来读取数据使用导入模板来读取数据,需按以下步骤进行:(1) 选择File→Import Data选项,然后弹出一个文件选择对话框;也可以使用uiimport函数来打开导入数据模板。

(2) 在文件选择对话框中选择想导入数据的文本文件,然后单击Open按钮,导入数据模板就会打开该文件并准备处理其内容。

(3) 指定用于分开单个数据的字符,该字符称为分隔符或列分隔符。

在多数情况下可以用导入模板来设定分隔符。

(4) 选择要导入的变量。

在默认情况下,导入模板将所有的数值数据放在一个变量中,而将文本数据放在其他变量中。

(5) 单击Finish按钮完成数据的导入。

当使用导入模板来打开一个文本文件时,在导入模板对话框的预览区仅显示原始数据的一部分,通过它,用户可以验证该文件中的数据是否为所期望的。

导入模板也根据文件中的数据分隔符来对导入的数据进行预处理。

在导入模板中打开工作区中的grade.txt文件。

english math physicjoe 80 90 60susan 78 98 88rob 67 90 89图2-1 将数据通过模板导入在图2-1中,导入模板已辨认space字符,把它作为文件中数据的分隔符,并建立了两个变量:data(包含文件中所有数值数据)和textdata(包含文件中所有文本数据)。

当导入模板正确导入文件中的数据后,就会显示它所建立的变量。

要选择一个变量来导入数据,可单击它名称后面的复选框。

在默认情况下,所有变量都会被选中。

在导入对话框的右面显示了导入模板建立的变量内容。

要查看其他变量,只需要单击该名称。

在选择好要导入的变量后,单击Next按钮,如图2-2所示。

图2-2 使用模板查看各变量数据在默认情况下,导入模板将文件中所有的数值数据放在一个变量中;若文件包含文本数据,则模板将它们放在另外一个变量中;若文件包含行或列,模板也将它们作为各自独立的变量分别称为行头和列头。

2. 使用函数来读取文本数据若要在命令行或在一个 M 文件中读取数据,必须使用 MATLAB 数据函数,函数的选择则是依据文本文件中数据的格式。

而且文本数据格式在行和列上必须采取一致的模式,并使用文本字符来分隔各个数据项,称该字符为分隔符或列分隔符。

分隔符可以是space、comma、semicolon、ab或其他字符,单个的数据可以是字母、数值字符或它们的混合形式。

文本文件也可以包含称之为头行的一行或多行文本,或可以使用文本头来标志各列或各行。

在了解要输入数据的格式之后,便可以使用 MATLAB 函数来读取数据了。

若对 MATLAB 函数不熟悉,可从表2-2中了解几个读取函数的一些使用特征。

表2-2 读取函数的比较3. 读取数值文本数据若用户的数据文件只包含数值数据,则可以使用许多MATLAB函数,这取决于这些数据采用的分隔符。

若数据为矩形形状,也就是说,每行有同样数目的元素,这时可以使用最简单的命令load(load也能用于导入MAT文件,该文件为用于存储工作空间变量的二进制文件,如果文件名后缀是.dat,则MATLAB会以MAT 文件格式进行读取)。

例如,文件my_data.txt包含了两行数据,各数据之间由space字符隔开。

当使用load时,它将读取数据并在工作空间中建立一个与该文件同名的变量,但不包括扩展名。

>>load my_data.txt;调用whos命令查看工作空间的变量。

>> whosName Size BytesClass Attributesdata 3x3 72doublemy_data 3x4 96doubletextdata 4x1 314cell此时可以查看与该文件同名的变量的值>> my_datamy_data =0.3242 0.4324 0.3455 0.67540.4566 0.9368 0.9892 0.92740.4658 0.2832 0.9373 0.8233若想将工作空间的变量以该文件名命名,则可以使用函数形式的load,下面的语句将文件导入工作空间并赋给变量AA=load('my_data.txt');4. 读取有分隔符的ASCII数据文件如果数据文件不使用空格符而是使用逗号或是其他符号作为分隔符,用户可以选择多个可用的导入数据函数。

最简单的便是使用函数dlmread。

举个例子来说,一个名为lcode.dat的数据文件,数据内容由逗号分隔。

0.3445,0.8433,0.78650.7562,0.4233,0要把该文件的全部内容读入阵列A,只须输入如下命令:>> A=dlmread('lcode.dat',',')即可以把数据文件中使用的分隔符作为函数dlmread的第二个参数。

注意:即使每行的最后一个数据后面不是逗号,dlmread函数仍能正确读取数据,因为dlmread忽略了数据之间的空格符。

因此,即使数据为如下格式,前面的dlmread命令仍能正常工作。

A =0.3445 0.8433 0.78650.7562 0.4233 0另外需要注意的是,分隔符只能选取单个字符,不能用字符串来作为分隔符。

5. 使用文本头读取数值数据要读取一个包含文本头的ASCII码数据文件,可以使用textread函数,并指定头行参数。

调用函数textread 同样非常简单,同时对文件读取的格式处理能力更强,函数接收一组预先定义好的参数,由这些参数来控制变量的不同方面。

相关主题