matlab 环境下二进制文件的操作
二进制文件与文本文件概述
在物理层面上,文件都是以二进制的方式存储在内存中的。所谓二进制文件和文本文件其区别是在逻辑层面上的。文本文件是基于字符编码的,而二进制文件是基于数值编码的。比如,常见的字符编码有 ASCII 码和 UNICODE 码,其中 ASCII 一个字符占1字节,而 UNICODE 码一个字符占 2 字节。对于文本文件而言,编码方式确定后,其占用的存储空间也就确定了。但是对于二进制文件,每个值可以占用多少存储空间用户是可以自定义的,例如 1 字节(如 8 位整型),2 字节(如 16 位整型),4 字节(如 32 位整型、单精度浮点型),8 字节(如 64 位整型)。所以二进制编码的文件是变长的。
matlab 文件 I/O 操作低级函数列表
函数名称 | 函数功能 |
---|---|
fclose | 关闭文件 |
ferror | 返回文件 I/O 过程中的错误 |
feof | 查询文件指针是否到达文件末尾 |
fgetl | 从文本文件中读取一行,剔除换行符 |
fgets | 从文本文件中读取一行,保留换行符 |
fopen | 打开一个文件,返回文件 ID |
fprintf | 向文本文件中写入格式化数据 |
fread | 以字符串形式读入全部数据 |
frewind | 将文件指针置于文件起始处 |
fscanf | 从文本文件中格式化读入数据 |
fseek | 将文件指针移至文件中指定的位置 |
ftell | 返回文件指针的位置 |
fwrite | 向二进制文件中写入数据 |
matlab 低级 I/O 函数详解
- fopen 一是打开文件,二是获取当前已打开文件的信息。
- 调用格式:
- fid = fopen(‘filename’)
- fid = fopen(‘filename’,permission)
- fid = fopen(‘filename’,permission,machineformat)
- fid = fopen(‘filename’,permission,machineformat,encoding)
- [fid,message] = fopen(‘filename’,…)
- fids = fopen(‘all’)
- [filename,permission,machineformat,encoding] = fopen(fid)
- 参数解释
- filename:为待打开的文件名称其类型应为字符型。即可以是绝对路径,也可以是相对路径。
- permission:值为一些特殊的字符串,它描述了文件操作的控制选项,其中包括读、写、追加和更新,此外还描述了如何打开文件。其中二进制方式打开文件的各种命令如下:
- 调用格式:
命令 | 说明 |
---|---|
‘r’ | 打开文件以读取数据(默认) |
‘w’ | 打开或创建文件以写入数据。在打开文件时,将会擦除原有的所有数据 |
‘a’ | 打开或创建文件,在文件末尾追加写入数据 |
‘r+’ | 打开文件以读取或写入数据 |
‘w+’ | 打开或创建文件以读取或写入数据,在打开文件时,擦除原有数据 |
‘a+’ | 打开或创建文件以读取或追加写入数据,不会擦除文件原有的数据 |
‘A’ | 追加数据(用于磁带驱动器) |
‘W’ | 写入数据(用于磁带驱动器) |
如果要采取文本方式操作文件,则只需在控制方式字符串后加入 ‘t’ 即可。比如 ‘at’,’at+’ 等。 但是文本方式下的文件操作效率比较低,因为在文本控制方式下,文件 I/O 需要增加额外的操作。(windows 系统)。
- 读操作遇到回车和换行后('\r\n'),会自动删除回车和换行
- 写操作遇到换行符后,会自动在换行符前加入回车。
以下插入一个有趣的实例:
``` matlab
close all
clear
clc
% 生成随机矩阵
load test
% fid = fopen('data1.txt','w');
fid = fopen('data2.txt','wt');
fprintf(fid,'the time serise of 000002\r\n');
fprintf(fid,'dates open high close low volume\r\n');
formats = '%s %.4f %.4f %.4f %.4f %.4f\r\n';
fprintf(fid,formats,string(datatable.date),datanum(:,1),datanum(:,2),...
datanum(:,3),datanum(:,4),datanum(:,5));
fclose(fid);
```
这里产生的 data1.txt 文件和 data2.txt 文件是不同的。
图片效果不太好,自己做一遍体会一下。
- machineformat:不同的计算机系统可能会采取不同的字节顺序。运用 machineformat 可以指定文件操作的字节顺序。在默认的情况下,matlab 采用本机默认的字节顺序来操作文件(字节顺序一般与处理器类型和操作系统有关),但以下情况需要给出本参数。
- 当读取非本机计算机系统上创建的文件时
- 当用户需要采用一种特殊的字节顺序读取若干比特数据时
- 当在本机上创建可用于另一种计算机系统的文件时
**<center>machineformat 参数取值列表</center>**
machineformat 参数值 | 含义 |
---|---|
‘n’ or ‘native’ | 系统使用的字节顺序(默认) |
‘b’ or ‘ieee-be’ | 大端模式顺序 |
‘l’ or ‘ieee-le’ | 小端模式顺序 |
’s’ or ‘ieee-be.l64’ | 大端模式顺序,用于 64 位系统 |
’s’ or ‘ieee-le.l64’ | 小端模式顺序,用于 64 位系统 |
windows 系统字节顺序通常是小端模式。而大多数的 unix 系统字节顺序是大端模式。小端模式的含义是,数据低位储存在内存的低位地址(先存储数据的低位),数据的高位存储在高位地址(后存储数据的高位)。而大端模式正好相反。
- encoding 参数指定了字符编码方式,默认值有系统决定。
- fid:matlab 中作为已打开文件的唯一标识。如果打开失败,返回 -1 。打开成功,则返回大于或等于3的整数。
- message:当 fopen 无法打开某个文件时,message 就会返回一个与系统有关的错误信息。当正确打开时,message 为空字符串。
- fseek 将文件指针移动到指定的位置。
- 调用方式:
- fseek(fid,offset,origin)
- status = fseek(fid,offset,origin)
- 参数解释
- offset 文件指针从 origin 位置开始移动 offset 个字节。该参数可以为正负或者为零。正整数表示向结尾方向移动,负整数表示向文件开始方向移动。
- origin: 表示文件指针移动的参考位置。
- 调用方式:
origin | 含义 |
---|---|
‘bof’ or -1 | 以文件的起始处为参考值 |
‘cof’ or 0 | 以文件指针的当前位置为参考值 |
‘eof’ or 1 | 以文件的末尾为参考值 |
3. frewind 该函数用来将文件指针移动到文件的起始处。
frewind(fid)
% 等价于
fseek(fid,0,'bof')
- ftell
指出当前文件指针在文件中的位置,即文件指针相对于文件起始位置的偏移量。其返回值为 -1 或者非负整数。 -1 表示获取位置失败,而非负整数则表示相对于 起始位置位置 的偏移量。
close all
clear
clc
% 生成随机矩阵
fid = fopen('rand.dat','w');
fwrite(fid,rand(5,5),'float32');
fclose(fid);
clear fid;
fidr = fopen('rand.dat','r');
fseek(fidr,0,'bof');
nb = ftell(fidr);
fseek(fidr,0,'eof');
ne = ftell(fidr);
fileSize = ne - nb;
- fread
功能是从二进制文件中读取数据,fread 函数执行成功后,文件指针会根据已读取的数据长度自动移动文件的指针。
调用方式:
- a = fread(fid)
- a = fread(fid,sizea)
- a = fread(fid,sizea,precision)
- a = fread(fid,sizea,precision,skip)
- a = fread(fid,sizea,precision,skip,machineformat)
- [a,count] = fread(…)
参数解释:
sizea
- inf:读取从当前文件指针位置到文件结束,所有数据。
- n:从当前文件指针位置读取n个数据单元至 a ,其中读取的字符数由参数 precision 和 n 共同决定。
- [m,n]:即返回内容是规模为 m * n 的矩阵,注意这里的矩阵仍然是按照列排列的。
precision:决定以何种类型读取文件中的数据单元,并且还可以设置输出数组的数据类型。
precision 参数的使用形式
precision | 含义 |
---|---|
‘source’ | 指定以何种方式读取文件的数据单元,默认为 double |
‘source => output’ | 指定读取和输出的类型 |
’ * source’ | 指定的读取和输出类型一样 |
‘N * source’ | 此方式与 fread 函数的第四个参数 skip 联合使用。通知 fread 函数每次跳过文件知道的数据之前读区 N 个有 source 标识的数据单元。 |
^’N * source => output’ | ^ |
这里需要注意的是。当未指定 skip 参数时,ubit8 or uint8 是等价的,bit16 与 int16 是等价的。但是如果指定了 skip 则有所区别。
skip :表示每次读取操作后指针跳过的**字节**数,默认为0。当 precision 指定 ubitn 或 bitn 时,skip 的单位不再是字节而是 bit。
当与 fopen 函数 'N * source '等形式联合使用时,可以实现连续读取 N 组数据、跳过 skip 字节的功能。
- count:成功读入元素的数目。
fwrite:将数据写入二进制文件。
- 调用方式:
- fwrite(fid,a)
- fwrite(fid,a,precision)
- fwrite(fid,a,precision,skip)
- fwrite(fid,a,precision,skip,machineformat)
- count = fwrite(…)
- 参数解释:
- precision:这里当然只能指定一种输出类型。
fclose:用来关闭一个或所有打开的文件。
- 调用方式:
- fclose(fid)
- fclose(‘all’)
- status = fclose(…)
注意,关闭文件返回的状态,0 表示成功,而 -1 表示失败
- feof:
status = feof(fid)
feof 函数作用是查看上一步文件操作是否设置了文件结束符。如果文件结束符 (end-of-file indicator) 被设置,则返回值 status 为 1,否则返回 0 。
所谓设置文件结束符是指:执行了读操作,并且将文件指针移动到了文件末尾。
- ferror:返回进行文件 I/O 操作时发生的错误信息。
- 调用方式:
- message = ferror(fid)。返回最近一次 I/O 操作时发生的错误,如果没有则为空。
- [message,errnum] = ferror(fid)。除了返回错误信息外还返回错误的个数。
- […] = ferror(fid,’clear’)。clear 清除操作过程中的错误。
其他二进制文件操作
matlab 功能强大可以广泛运用于各个领域,但是我经历有限,与我研究方向没有太大关系的内容只能舍弃或者略过,请见谅。如果要看更详细的内容,可以看这本书,或者自行查阅帮助文档。
- imfinfo:该函数用来读取图像文件的信息。
- saveas:该函数可以方便地将 matlab 的图形窗口保存称为图像文件。类似功能的还有 print 函数。