admin 管理员组

文章数量: 887032


2024年1月5日发(作者:数据库网)

使用文件I/O函数

前面介绍的都是MATLAB中的一些高级函数,除此之外MATLAB还包含了一组低端的文件I/O函数,如前面介绍的所有文件的打开和关闭函数:fopen函数和fclose函数。这些函数是建立在ANSI标准C库中的I/O函数。若用户对C语言熟悉的话,那么也肯定熟悉这些函数。比如,MATLAB 文件I/O函数使用和C语言同样的编程模式等。要读写这些数据,需进行以下几步:

(1) 使用fopen函数打开文件。fopen函数将会返回一个文件标志,通过它,就可以使用其他所有的低端文件I/O函数。

(2) 对文件进行操作,如:读写二进制数据、格式化读写文本数据等。

(3) 使用fclose函数来关闭文件。

2.4.1 二进制数据的读取

使用fread函数可从文件中读取二进制数据,它将每个字节看成整数,并将结果以矩阵形式返回。对于读取二进制文件,fread必须制定正确的数据精度。

fread的基本调用方法是:

A=fread(fid)

其中fid是一个整数型变量,是通过调用fopen函数获得的,表示要读取的文件标识符,输出变量A为矩阵,用于保存从文件中读取的数据。

例如文件的内容如下:

test it

用fread函数读取该文件,输入如下命令:

>> f=fopen('','r');

>> answer=fread(f)

answer =

116

101

115

116

32

105

116

输出变量的内容是文件数据的ASCII码值,若要验证读入的数据是否正确,通过下面的命令可以验证。

>> disp(char(ans1'))

test it

fread函数的第二个输入参数可以控制返回矩阵的大小,例如:

>> f=fopen('','r');

>> answer=fread(f,2)

answer =

116

101

也可以把返回矩阵定义为指定的矩阵格式,例如

>> f=fopen('','r');

>> an=fread(f,[2 3])

answer =

116 115 32

101 116 105

使用fread函数的第三个输入变量,可以控制fread将二进制数据转成MATLAB

矩阵用的精度,包括一次读取的位数(Number of Bits)和这些位数所代表的数据类型。

常用的精确度类型有下列几种,如表2-6所示。

表2-6 常见的精确度类型

数 据 类 型说 明

char带符号的字符(通常是8h16)

uchar无符号的字符(通常是8bits)

short短整数(通常是16bits)

long长整数(通常是16bits)

float单精度浮点数(通常是32bits)

double双精度浮点数(通常是64bis)

2.4.2 二进制数据的写入

使用fwrite函数可将矩阵按所指定的二进制格式写入文件,并返回成功写入文件的大小。函数的调用方式如下:

count=fwrite(fid,A,precision)

其中,count用来返回写入文件数据的大小,f参数同样是通过fopen函数获得的整数型变量,表示文件标识符,A表示要写入的数据矩阵,第三个参数precision同二进制读取函数的参数一样,表示数据的写入格式。

在下例中fwrite产生一个大小为100字节的二进制文件,它包含了一个5×5阶魔方矩阵,共25个元素,每个元素占用4个字节。

f=fopen('', 'w');

fwrite(f,magic(5), 'int32');

fclose(f)

二进制文件在不同的计算机架构上可能存储方式不同,所以二进制文件存在兼容性问题,而文本文件则不存在这种兼容性问题。不同的存储方式导致在不同架构上保存的二进制文件在另外的平台上无法读取,这主要是因为多字节数据类型在计算机硬件上的存储顺序不同。在MATLAB中,无论计算机上的数据存储顺序是哪一种,都可以读写二进制文件,但要正确地调用fopen函数打开文件。

2.4.3 格式化读取ASCII码数据

fscanf函数与C语言中的fscanf在结构、含义和使用上都很相似,即能够从一个有格式的文件中读入数据,并将它赋给一个或多个变量。两个函数都采用同一组格式指定符来控制输入数据的格式,fscanf的格式指定符由字符%开头,常用格式如表2-7所示。

表2-7 常见的用于输入的格式转换符

格式转换符意 义

%c读取字符型变量,也可以指定多个字符,'%3c'

%s读取字符串变量

%d读取整数型变量

%f读取浮点数

%g读取双精度浮点数

例如,我们仍然读取my_文件中的数据,其数据内容是:

4.5646767e-001 8.2140716e-001 6.1543235e-001

1.8503643e-002 4.4470336e-001 7.9193704e-001

通过下面这段代码,将该文件中的数据读取到列向量T中。

>> f=fopen('my_','r');

>> T=fscanf(f,'%g');

>> fclose(f)

也可以通过以下代码段把文件数据读取到一个3×2矩阵A中。

>> f=fopen('my_','r');

>> A=fscanf(f,'%g',[3 2]);

>> fclose(f)

执行后结果如下,这时候A矩阵恰好是文件中数据矩阵的转置。

>> A

A =

0.4565 0.0185

0.8214 0.4447

0.6154 0.7919

2.4.4 格式化写入文本数据

fprintf将会把数据转换为字符串,并将它们输出到屏幕或文件中。一个格式控制字符串包含转换指定符和可选的文本字符,通过它们来指定输出格式。转换指定符用于控制阵列元素的输出。

当fprint函数做标准输出,也就是运行结果显示在屏幕上的时候,它的功能和disp函数相类似,区别仅在于fprint可以输出特定格式的文本数据。

比如,创建一个2×2的魔方矩阵,然后打开一文件,写入数据。

>> clear all;

>> x=magic(2);

>> fid=fopen('','w');

>> fprintf(fid,'%4.2f %8.4fn',x);

>> fclose(fid);

执行这段程序段之后,我们可以检验一下执行结果:

>> x

x =

1 3

4 2

>> type

1.00 4.0000

3.00 2.0000

可以看出,fprintf函数在打印显示矩阵数据时,数据转换规则是可以按列方式循环作用于矩阵的各个元素的,这个例子中显示出来的结果就好像原矩阵的转置,而且分别按数据转换规则显示。

2.4.5 控制文件位置指针

每一次打开文件时,MATLAB就会保持一个文件位置指针(File Position Indicator),由它决定下一次进行数据读取或写入的位置。控制此指针的函数如表2-8所示。

表2-8 控制位置指针的函数

函 数 名 称功 能 说 明

fseek设定指针位置

ftell获得指针位置

frewind重设指针到文件起始位置

feof测试指针是否在文件结束位置

fseek 函数用于指定文件指针的位置,调用方式如下:

status=fseek(fid,offset,origin)

fid是指定的文件标识符。offset为整数型变量,表示相对于指定位置需要的偏移字节数,正数表示向文件末尾偏移,负数表示向文件开头偏移。Origin可以是特定字符串,也可以是整数,表示文件中的参考位置。参考位置的参数说明如表2-9所示。

表2-9 参考位置参数的说明

参考位置(origin)说 明

'bof '或者 -1文件开头

'cof '或者 0文件中当前位置

'eof '或者 1文件末尾

ftell 函数用来获得当前文件指针的位置,调用方式如下:

position=ftell(fid)

fid是指定的文件标识符。Position为返回值,表示当前指针的位置。position是以相对于文件开头的字节数来表示的。如果返回值为–1,表示未能成功调用。这是可以通过调用feeeor(fid)的具体的错误信息。

frewind 函数用来把文件指针重新复位到文件开头。调用方式如下:

frewind(fid)

其中fid为指定的文件标识符,其作用和fseek(fid,0,-1)是等效的。

feof 函数用来判断是否到达文件末尾。调用方式如下:

eofstat=feof(fid)

其中fid为指定的文件标识符。eofstat是返回值,当到达文件末尾时,eofstat为1;否则为0。比如我们仍然对文件my_执行以下命令,然后测试文件指针位置

>> f=fopen('my_','r');

>> A=fscanf(f,'%g',[3 2])

A =

0.4565 0.0185

0.8214 0.4447

0.6154 0.7919

>>feof(f)

ans=

0

在本例中,文件指针指向最后一个数据,而不是文件末尾,因此返回值是0,而不是1,但是若执行以下命令:

>> f=fopen('my_','r');

>> A=fscanf(f,'%g',[4 2])

A =

0.4565 0.4447

0.8214 0.7919

0.6154 0

0.0185 0

>>feof(f)

ans=

1

在my_文件中只包含6个数字,因此feof函数返回值为1。若要重新设置指针到起始位置,就可以直接使用frewind函数。


本文标签: 文件 函数 数据 位置