【IO 操作】
IO 操作在不同层次有不同的概念和单位,每一次 IO 就是一次请求,对于磁盘来说,一个 IO 就是读或者写磁盘的某个或者某段扇区,读写完了,这个 IO 也就结束了
在 matlab 中,IO 操作即将数据从磁盘读入 matlab 的工作区,或将数据从 matlab 的工作区写入磁盘
【文件打开与关闭】
FID=fopen(fileName,permission):根据 fileName 所指定的路径,依照 permission 所指定的模式打开文件,返回文件标识符 FIDstatus=fclose(FID):关闭 FID 所映射的文件,并返回状态码 status
说明:
- FID:文件标识符,在系统(无论何种系统均有 FID,类似 PID)中用于唯一标识文件,需要注意的是,如果 FID 不代表打开文件或其等于 0(标准输入)、1(标准输出)、2(标准错误),关闭文件时会引发错误
- fileName:可以是相对路径,也可以是绝对路径
- permission 的模式如下表:
| 标识 | 模式 | 标识 | 模式 |
|---|---|---|---|
| ‘r’ | 读文件,要求文件必须存在 | ‘r+’ | 读写文件,要求文件必须存在 |
| ‘w’ | 写文件,若文件已存在会将内容覆盖,若文件不存在会创建文件 | ‘w+’ | 读写文件,若文件已存在会将内容覆盖,若文件不存在会创建文件 |
| ‘a’ | 写文件,若文件已存在会将内容追加,若文件不存在会创建文件 | ‘a+’ | 读写文件,若文件已存在会将内容追加,若文件不存在会创建文件 |
| ‘b’ | 表明打开文件为二进制文件,一般与上述 6 种标识混合使用,例如:’rb’、’ab+’ |
- status:关闭文件的状态码,关闭成功返回 0,关闭失败返回 1
1 | >> fid=fopen('test.txt','r') |
【fread 与 fwrite】
fread() 与 fwrite() 函数对二进制文件进行读写
a = fread(FID,num,precision):根据 FID 读取文件信息,用 precision 指定的数据格式,用 num 指定读取个数num=fwrite(FID,data,precision):根据 FID 写入数据 data,用 precision 指定的数据格式,返回写入数据个数
注:
- 关于 precision:其数据格式为
int32、float等,若未指定,默认为uint8 - 关于 num:在
fread()中,若 num 未指定,默认读取所有元素 - 无法利用 fread 和 fwrite 同时读写
- 由于 fread 和 fwrite 涉及到二进制编码问题,因此很少使用
1 | >> fid=fopen('test.bin','r+'); |
【fscanf 与 fprintf】
fscanf() 与 fprintf() 函数对文本文件进行读写
data=fscanf(FID,formatSpec,num):根据 FID 读取文件信息,用 formatSpec 指定的数据格式,num 表示读取个数,inf 表示读取到末尾(默认)num=fprintf(FID,formatSpec,data):根据 FID 写入文件信息,用 formatSpec 指定的数据格式
注:每次读写完数据后,指针句柄会指向接下来要读数据的位置
1 | >> fid=fopen('test.txt','r+'); |
【importdata 与 load】
importdata() 与 load() 用于将文件加载到工作区,一般来说,对于文本数据(.txt),利用 importdata() 加载,对于 matlab 标准数据(.mat),利用 load() 加载
a=importdata(fileName,delimiter,num):加载 fileName 指定的文件,delimiter 为分隔符,num 为跳过的标题行数load(fileName):将 mat 文件中的变量加载到工作区
注:可以利用 whos -file fileName.mat 来查看 mat 文件中的内容,使用该命令时不需将文件利用 load 载入,只要 mat 文件处于检测目录中即可
1 | >> importdata('test.txt',' ') |
【textscan 与 textread】
matlab 中,一般利用 textscan() 或 textread() 来读取格式化文本文件
a=textscan(FID,formatSpec):按照 formatSpec 格式读取 FID 所标识的文件,按列返回到元胞数组a=textscan(FID,formatSpec,'headerlines',num):按照 formatSpec 格式读取 FID 所标识的文件,读取过程中跳过第 num 行,按列返回到元胞数组a=textscan(FID,formatSpec,n):按照 formatSpec 格式读取 n 次 FID 所标识的文件,按列返回到元胞数组
1 | >> fid=fopen('test.txt'); |
[A,B,C...]=textread(filename,formatSpec):按照 formatSpec 格式读取 filename 所标识的文件,按列返回到向量[A,B,C...]=textread(filename,formatSpec,'headerlines',num):按照 formatSpec 格式读取 filename 所标识的文件,读取过程中跳过第 num 行,按列返回到向量[A,B,C...]=textread(filename,formatSpec,n):按照 formatSpec 格式读取 n 次 filename 所标识的文件,按列返回到向量
1 | >> [a,b]=textread('test.txt','%s %s'); |
注:
- 对于
a=textscan(FID,formatSpec,n)和[A,B,C...]=textread(filename,formatSpec,n),其一般用于每 n 行格式相同的数据 textscan()将多组数据读到一个元胞矩阵中;textread()将数据分别读取到不同的向量中textscan()使用前要先fopen(),完成后要fclose();textread()不需fopen()与fclose(),适用于格式统一的 txt 的一次性大批量读取textscan()每次读完数据后,指针句柄会指向接下来要读数据的位置;textread()每次读完数据后,指针句柄会返回文件头- 不推荐使用
textread()
【xlsread 与 csvread】
xlsread 用于读取 xls 文件
a=xlsread(fileName):读取 xls 文件中的所有单元格的数据a=xlsread(fileName,-1):读取 xls 文件中的单元格的数据,用户可以利用鼠标来选定范围。执行后,会后台打开 xls 文件并弹窗,在 xls 文件中用鼠标选定单元格后,点击弹窗的确认即可a=xlsread(fileName,sheet):读取 xls 文件中所在的 sheet,例如:’sheet1’a=xlsread(fileName,range):读取 xls 文件中的单元格范围,例如:’A1:B2’a=xlsread(fileName,sheet,range):读取 xls 文件中所在的 sheet 与 范围
csvread 用于读取 csv 文件
a=csvread(fileName):读取 csv 文件中的所有数据a=csvread(fileName,R,C):从 csv 文件中的行偏移 R 和列偏移 C 开始读取数据a=csvread(fileName,R1,C1,R2,C2):读取从 csv 文件中的行偏移 R1、列偏移 C1 和 行偏移 R2、列偏移 C2 范围内的数据
注:当需要写 xls 文件或写 csv 文件时,利用 xlswrite() 和 csvwrite() 即可,使用方法与上述基本相同
【dlmread】
dlmread() 用于将 ASCII 分隔的数值数据文件读取到矩阵中,一般用于读取 tsv 文件
dlmread(fileName):将文件中重复的空白视为分隔符进行读取dlmread(fileName,'delimiter'):使用指定的分隔符 delimiter 读取数据,同时会将重复的分隔符视为单独的分隔符dlmread(fileName,delimiter,R,C):使用指定的分隔符 delimiter 从行偏移 R 和列偏移 C 开始读取数据读取数据dlmread(fileName,delimiter,R1,C1,R2,C2):使用指定的分隔符 delimiter 读取行偏移 R1、列偏移 C1 和 行偏移 R2、列偏移 C2 范围内的数据
注:当需要写 ASCII 分隔的文件时,利用 dlmwrite() ,使用方法与上述基本相同
【文件读写句柄控制】
在大多数 I/O 函数中,读写完毕后,指针都会指向接下来要读文件的位置,这就造成了无法连续的读写数据,因此可以利用以下几个函数来控制句柄,从而实现自主控制文件读写
st=feof(FID):如果文件设置了文件结束指示符且已到达,则返回 1;如果未设置文件标识符,则返回 0frewind(FID):将文件指针位置重定向至开头pos=ftell(FID):返回文件指针位置,以字节为单位从头开始计算,若返回 -1 表示查询失败status=fseek(FID,offset,origin):重新定位文件指针位置,定位成功返回 1,定位失败返回 -1- origin >= 0:在 origin 后移动指针 offset 个字节
- origin <0:在 origin 前移动指针 offset 个字节
注:
- 关于文件结束符 EOF:End of File,是程序中判断 I/O 结尾的标志,其值为 1
- origin 常见取值解释为:
- bof 或 -1:文件开头
- cof 或 0:文件当前位置
- eof 或 1:文件结尾
1 | >> fid=fopen('test.txt','r+'); |