Matlab系列之文件操作

2020-07-20 16:26:21 浏览数 (1)

介绍

首先介绍下文件操作的相关概念吧,文件一般指存储在外部介质上的数据的集合,即一般数据是以文件的形式存储在外部介质上,这个介质可以是我们的硬盘也可以是其他的具有存储能力的物体。

操作系统就是以文件为单位对数据进行管理,即如果要找到外部介质上的数据,就需要先找到对应的文件,然后从该文件中读取需要的数据,如果是保存一段数据,也需要有个用于存储数据的文件,这个文件可以是已存在的,也可以是新建生成的,这样子才能将数据写入其中。

MATLAB将文件根据数据的形式分为了ASCII文件和二进制文件这两种,ASCII文件也就是常称的文本文件,文件内容中的每一个字节放一个ASCII码,即代表一个字符。二进制文件就是把内存中的数据按其在内存中的存储形式输出到硬盘上存放。这两种文件也有各自的优缺点,文本文件中,一个字节代表一个字符,因此便于直接对字符进行处理,也方便直接输出字符到文本中,但是会占据较多的空间,也比较耗时;而二进制文件采用二进制形式保存数据,会节省掉所需的空间和转换时间,不过由于每一个字节对应的不是一个字符,因此无法直接输出字符形式。

下表列出的是MATLAB中主要的文件操作函数

函数分类

函数名

作用

打开和关闭文件

fopen

打开文件

fclose

关闭文件

文件I/O

save

把工作区的变量存到.mat后缀的文件中

load

将.mat文件中的变量加载到工作区

fread

读二进制文件

fwrite

写二进制文件

fscanf

从文件中读格式数据

fprintf

写文件数据

fgetl

从文件中读行,不包括换行符

fgets

从文件中读行,包括换行符

文件定位

feof

检验是否为文件结尾

fseek

指针指向文件指定位置

ftell

获取指针指向文件的当前位置

frewind

指针指向文件开始位置

临时文件删除

tempdir

系统临时文件夹名称

tempname

临时文件夹中的临时文件名称

现在就开始对上表中的一些函数进行介绍。

文件的打开与关闭

在对一个文件进行读写操作前应该打开文件,然后在使用结束之后关闭该文件,这之中将分别用到fopen打开文件,fclose关闭文件,fopen的调用格式为:

代码语言:javascript复制
fileID=fopen(filename)
fileID=fopen(filename,permission)
fileID=fopen(filename,permission,machinefmt,encodingIn)
[fileID,errmsg]=fopen(___)

fIDs=fopen('all')
filename=fopen(fileID)
[filename,permission,machinefmt,encodingOut]=fopen(fileID)

其中fileID为调用文件时返回的文件句柄,文件打开后,就可以使用文件句柄来代替该文件,然后对其进行操作,不过在打开文件的时候会带上一个访问类型也就是上面的permission,访问类型有以下的几种:

文件访问类型

说明

'r'

打开要读取的文件。

'w'

打开或创建要写入的新文件。放弃现有内容(如果有)。

'a'

打开或创建要写入的新文件。追加数据到文件末尾。

'r '

打开要读写的文件。

'w '

打开或创建要读写的新文件。放弃现有内容(如果有)。

'a '

打开或创建要读写的新文件。追加数据到文件末尾。

'A'

打开文件以追加(但不自动刷新)当前输出缓冲区。

'W'

打开文件以写入(但不自动刷新)当前输出缓冲区。

‘r’是默认的类型,也就是说当使用第一个调用格式时,是只有读取的能力,无法进行写操作;还有就是当没有指定文件的类型时,默认的是以二进制文件访问,如果要打开文本文件,就需要在访问类型上加个’t’,例如:’rt’、’wt ’等,打开文件成功后将会得到一个正整数的句柄,若打开失败,会返回句柄值-1,例如要打开文件myfile.dat并从中读取数据,命令为:

file=fopen(‘myfile.dat’,’r’)

接着对刚刚的几种调用格式做介绍:

fileID=fopen(filename)

打开文件filename以便以二进制读取形式进行访问,并返回等于或大于3的整数文件标识符。MATLAB保留文件标识符0、1和2分别用于标准输入、标准输出(屏幕)和标准错误。如果fopen无法打开文件,则fileID为-1。

fileID=fopen(filename,permission)

将打开由permission指定访问类型的文件。

fileID=fopen(filename,permission,machinefmt,encodingIn)

使用machinefmt参数另外指定在文件中读写字节或位时的顺序。可选的encodingIn参数指定与文件相关联的字符编码方案。

machinefmt有以下几种结果:

结果

含义

'n'或'native'

系统字节排序方式(默认)

'b'或'ieee-be'

Big-endian排序

'l'或'ieee-le'

Little-endian排序

's'或'ieee-be.l64'

Big-endian排序,64位长数据类型

'a'或'ieee-le.l64'

Little-endian排序,64位长数据类型

encodingIn如下,如果没有指定编码方式,则使用系统的默认编码方案打开文件进行处理,如果为编码指定的值不在支持的值列表中,则MATLAB会发出警告。有时(并非总是)指定其他编码名称会产生正确的结果。

'Big5'

'ISO-8859-1'

'windows-874'

'Big5-HKSCS'

'ISO-8859-2'

'windows-949'

'CP949'

'ISO-8859-3'

'windows-1250'

'EUC-KR'

'ISO-8859-4'

'windows-1251'

'EUC-JP'

'ISO-8859-5'

'windows-1252'

'EUC-TW'

'ISO-8859-6'

'windows-1253'

'GB18030'

'ISO-8859-7'

'windows-1254'

'GB2312'

'ISO-8859-8'

'windows-1255'

'GBK'

'ISO-8859-9'

'windows-1256'

'IBM866'

'ISO-8859-11'

'windows-1257'

'KOI8-R'

'ISO-8859-13'

'windows-1258'

'KOI8-U'

'ISO-8859-15'

'US-ASCII'

'Macintosh'

'UTF-8'

'Shift_JIS'

如果fopen打开文件失败,则使用[fileID,errmsg]=fopen(___)将可以返回一条因系统而异的错误消息。否则,errmsg是一个空字符向量。可以将此语法与前面语法中的任何输入参数结合使用。

fIDs=fopen('all')

返回包含所有打开文件的文件标识符的行向量。为标准输入、输出以及错误而保留的标识符不包括在内。向量中元素的数量等于打开文件的数量。

filename=fopen(fileID)返回上一次调用fopen在打开fileID指定的文件时所使用的文件名。输出文件名将解析到完整路径。fopen函数不会从文件读取信息来确定输出值。

[filename,permission,machinefmt,encodingOut]=fopen(fileID)还会返回上一次调用fopen在打开指定文件时所使用的权限、计算机格式以及编码。如果是以二进制模式打开的文件,则permission会包含字母'b'。encodingOut输出是一个标准编码方案名称。fopen不会从文件读取信息来确定这些输出值。无效的fileID会为所有输出参数返回空字符向量。

当文件读写完成后,将使用fclose来关闭文件,其调用格式为:

fclose(fileID)关闭打开的文件。

fclose('all')关闭所有打开的文件。

status=fclose(___)

当关闭操作成功时,status=fclose(___)将返回status0。否则,将返回-1。可以将此语法与前面语法中的任何输入参数结合使用。

也其实不关闭也能用,但是这样会增加系统资源的消耗,或许做小项目的时候可能会没有什么感觉,但是东西做大了,你会发现吧,资源能省一点是一点。

文件I/O

1、save函数

save函数作用就是将工作区中的变量保存到硬盘上

调用格式:

代码语言:javascript复制
save(filename)
save(filename,variables)
save(filename,variables,fmt)
save(filename,variables,version)
save(filename,variables,version,'-nocompression')
save(filename,variables,'-append')
save(filename,variables,'-append','-nocompression')
savefilename

使用说明:

save(filename)将当前工作区中的所有变量保存在MATLAB格式的二进制文件(MAT文件)filename中。如果filename已存在,save会覆盖该文件。

save(filename,variables)仅保存variables指定的结构体数组的变量或字段。

save(filename,variables,fmt)以fmt指定的文件格式保存。variables参数为可选参数。如果不指定variables,save函数将保存工作区中的所有变量。

fmt的取值如下表,默认为’-mat’

fmt的值

文件格式

'-mat'

二进制的MAT文件格式。

'-ascii'

具有8位精度的文本格式。

'-ascii','-tabs'

具有8位精度的以制表符分隔的文本格式。

'-ascii','-double'

具有16位精度的文本格式。

'-ascii','-double','-tabs'

具有16位精度的以制表符分隔的文本格式。

save(filename,variables,version)保存为version指定的MAT文件版本。variables参数为可选参数,其取值如下表,不过我感觉这个功能应该没必要用上,毕竟要跨版本的使用MATLAB才可能会有版本的需求,要查看或设置MAT文件的默认版本,请转至主页选项卡,然后在环境部分点击

预设。选择MATLAB>常规>MAT文件,然后选择MAT文件保存格式选项。。

Version的值

加载到的MATLAB版本

支持功能

压缩

每个变量大小的最大值

'-v7.3'

7.3(R2006b)或更高版本

保存并加载部分变量,以及版本7的所有功能。版本7.3还支持使用'-nocompression'选项保存变量而不进行压缩。

是(默认值)

≥2GB(64位计算机)

'-v7'

7.0(R14)或更高版本

Unicode字符编码。通过编码,可以在使用不同默认字符编码方案的系统之间共享文件,还可以使用版本6的所有功能。

每变量2^31字节

'-v6'

5(R8)或更高版本

N维数组、元胞数组、结构体数组、大于19个字符的变量名称,以及版本4的所有功能。

每变量2^31字节

'-v4'

全部

二维double、字符和稀疏数组。

每数组100,000,000个元素,每变量2^31字节

save(filename,variables,version,'-nocompression')将变量保存到MAT文件,而不压缩。'-nocompression'标志仅支持7.3版的MAT文件。因此,必须将version指定为'-v7.3'。variables参数为可选参数。

save(filename,variables,'-append')将新变量添加到一个现有文件中。如果MAT文件中已经存在变量,则save会使用工作区中的值覆盖它。

对于ASCII文件,'-append'会将数据添加到文件末尾。

save(filename,variables,'-append','-nocompression')将新变量添加到一个现有文件中,而不进行压缩。现有文件必须是和自己使用的是同一版本的MAT文件。

savefilename是命令形式的语法。命令形式需要的特殊字符较少。无需键入括号或者将输入括在单引号或双引号内。使用空格(而不是逗号)分隔各个输入项。

2、load函数

既然有存储的,自然也需要配一个重载的功能,从使用save存储的磁盘文件中重新加载变量内容到工作区中,也就是load函数的功能,调用格式:

代码语言:javascript复制
load(filename)
load(filename,variables)
load(filename,'-ascii')
load(filename,'-mat')
load(filename,'-mat',variables)
S=load(___)
loadfilename

说明:

load(filename)从filename加载数据。

如果filename是MAT文件,load(filename)会将MAT文件中的变量加载到MATLAB工作区。

如果filename是ASCII文件,load(filename)会创建一个包含该文件数据的双精度数组。

load(filename,variables)加载MAT文件filename中的指定变量。

load(filename,'-ascii')将filename视为ASCII文件,而不管文件扩展名如何。

load(filename,'-mat')将filename视为MAT文件,而不管文件扩展名如何。

load(filename,'-mat',variables)加载filename中的指定变量。

S=load(___)使用前面语法组中的任意输入参数将数据加载到S中。

1)如果filename是MAT文件,则S是结构数组。

2)如果filename是ASCII文件,则S是包含该文件数据的双精度数组。

3、fread函数

该函数从文件中读取二进制数据,调用格式:

代码语言:javascript复制
A=fread(fileID)
A=fread(fileID,count)
A=fread(fileID,count,precision)
A=fread(fileID,count,precision,skip)
A=fread(fileID,count,precision,skip,machinefmt)
[A,count]=fread(___)

说明:

fread函数从指定文件fileID中读取二进制数据,将数据写入矩阵A中。可选输出count返回成功读入元素个数;fileID为文件标识符,由fopen函数得到;可选参数count确定读入多少的数据,如果不指定,则一直读到文件结束位置,其可选值如下:

1)n,读取n个元素到一个列向量。

2)inf,读到文件结束,返回一个与文件数据元素相同的列向量。

3)[m,n],读取元素填充一个m×n的矩阵,按列顺序填充。n可以为Inf,但m不能为该值。如果文件读入数据不够,则填充0。

recision表示度如数据精度的字符串,控制读入数据精度,MATLAB中精度如下表:

精度

说明

精度

说明

uchar

无符号字符:8位

uint16

无符号整数:16位

schar

有符号字符:8位

uint32

无符号整数:32位

int8

整数:8位

uint64

无符号整数:64位

int16

整数:16位

single

浮点数:32位

int32

整数:32位

float32

浮点数:32位

int64

整数64位

double

浮点数:64位

uint8

无符号整数:8位

float64

浮点数:64位

skip就是读取每个值之后要跳过的字节数,指定为标量。如果将precision指定为bitn或ubitn,以位为单位指定skip。

4、fwrite函数

fwrite函数向文件中写入二进制数据,用法:

代码语言:javascript复制
[count,errmsg]=fwrite(fileID,A,precision)
[count,errmsg]=fwrite(fileID,A,precision,skip)

fwrite函数将矩阵A中的元素写入指定的文件fileID中,将其值转化为指定的精度。fileID由fopen函数指定,count返回成功写入文件的元素个数,参数skip写入每个值之前要跳过的字节数,指定为标量。如果将 precision 指定为 bitn 或 ubitn,以位为单位指定 skip。

5、fscanf函数

该函数就是按指定的格式从文件中读取数据。用法:

代码语言:javascript复制
A=fscanf(fileID,format)
[A,count]=fscanf(fid,format.size)

fscanf函数从由fileID指定的文件中读取数据,并根据格式字符串进行转换,同时返回给矩阵A。参数size指定数据的长度,参数count返回成功读入的数据长度。

6、fprintf

fprintf函数向文件中写入格式化数据,用法:

代码语言:javascript复制
count=fprintf(fileID,format,A...)

fprintf函数将矩阵A或其他矩阵的是不数据按照“格式字符串也就是format”指定的形式进行格式转换,并将其写入指定的文件fileID中,count返回值为成功写入的数据长度。

7、fgets

fgets函数以字符串形式返回文件中的下一行内容,包含结束符,用法:

代码语言:javascript复制
tline= fgets(fileID)
tline= fgets(fileID,nchar)

如果使用fgets的返回文件下一行内容时,遇到文件结尾(EOF),则返回-1,所以返回的字符串中包含文本结束符,nchar指定返回的字符个数,在遇到行结束符时不追加字符。

8、getl

getl函数以字符串形式返回文件中的下一行内容,但是不包含结束符,用法:

代码语言:javascript复制
tline= getl(fileID)

如果使用getl的返回文件下一行内容时,遇到文件结尾(EOF),则返回-1,所返回的字符串中不包含换行结束符。

9、ferror

ferror函数查询MATLAB关于文件输入/输出操作的错误,用法:

代码语言:javascript复制
message=ferror(fileID)

ferror函数将文件标识符fid指定的文件的错误信息返回给message变量

10、feof

feof函数测试指定文件是否设置了文件结尾eof,如果设置了,则返回1,否则返回0,用法:

代码语言:javascript复制
eofstaus=feof(fileID)

记录到此,我觉得也足够吸收一段时间了,本篇的内容里有比较详细的说明,也有简单的介绍,不过并没有进行实际的操作演示,因为觉得不同的文件会有不同的需求,进行演示的话,容易误导别人,所以就直接放弃了演示的环节,只对大部分的文件操作用需要用到的函数进行用法的介绍,其余的就大家自行折腾了

0 人点赞