首页 > 编程笔记 > MATLAB笔记 阅读:15

MATLAB fread()和fwrite():读写二进制文件(附带实例)

与文本文件或 XML 文件相比,二进制文件容易与 MATLAB 进行交互。

MATLAB fwrite()写二进制文件

对 MATLAB 而言,二进制文件相对容易被写出来。fwrite() 函数的作用是将一个矩阵的元素按指定的二进制格式写入某个打开的文件中,并返回成功写入的数据个数。

fwrite() 函数的格式如下:
count=fwrite(fID,a,precision)
其中,fID 是从 fopen() 中得到的文件标识;a 是待写入的矩阵;precision 设定了结果的精度,可用的精度类型见 fread() 中的叙述。

【实例 1】写二进制文件示例。在命令行窗口中输入如下代码,并保存为 M 文件。
fID=fopen('tob.bin','w');
count=fwrite(fID,magic(6),'int32');
status=fclose(fID)
上述代码的执行结果是生成一个文件名为 tob.bin 的二进制文件,长度为 144B,包含 6×6 个数据,即 6 阶方阵的数据,每个数据占用 4B 的存储单位,数据类型为整型,输出变量 count 的值为 36。

由于是二进制文件,所以无法用 type 命令来显示文件内容。如果要查看其内容,则可在命令行窗口中输入以下代码,并显示相应的输出结果。
>> fID=fopen('tob.bin','r')
>> data=fread(fID,36,'int32')
fID =
    4
data =
    35
    3
    31
    8
    ...

【实例 2】实现读取二进制文件内容,并写入一个 6×6 的矩阵中。在命令行窗口中输入如下代码,并保存为 M 文件。
fID=fopen('tob.bin','w');
count=fwrite(fID,magic(6),'int32');
fID=fopen('tob.bin','r');
data=fread(fID,[6,6],'int32')
运行后,输出结果如下:
data =
    35     1     6    26    19    24
    3    32     7    21    23    25
    31     9     2    22    27    20
    8    28    33    17    10    15
    30     5    34    12    14    16
    4    36    29    13    18    11

【实例 3】将矩阵写入文件 a.txt 中。在命令行窗口中输入如下代码,并保存为 M 文件:
A=[1 3;4 5];
fID=fopen('a.txt','w')
count=fwrite(fID,A,'int32')
closestatus=fclose(fID)
fID=fopen('a.txt','r'); %再次打开文件
data=fread(fID,[2,2],'int32')
运行后,输出结果如下:
fID =
    21
count =
    4
closestatus =
    0
data =
    1     3
    4     5

MATLAB fread()读二进制文件

在 MATLAB 中,利用 fread() 函数可以从文件中读取二进制数据,读入时将每个字节看作一个整数,将结果写入一个矩阵中并返回。

fread() 函数的调用格式如下:
a=fread(fID)
其中,fID 是从 fopen 中得来的文件标识。MATLAB 读取整个文件并将文件指针放在文件末尾。

【实例 4】例如,文件 t.m 的内容如下:
a=[35,20,25,15,35];
b=[1554.88,1555.24,1555.76,1556.20,1556.68];
figure(1)
plot(a,b)
读二进制文件 t.m。在命令行窗口中输入如下代码,并保存为 M 文件。
fID=fopen('t.m','r') %打开文件
data=fread(fID); %读文件
disp(char(data')) %显示内容
运行后,输出结果如下:
fID =
    29
a=[35,20,25,15,35];
b=[1554.88,1555.24,1555.76,1556.20,1556.68];
figure(1)
plot(a,b)

【实例 5】使用 fread() 函数读二进制文件 t.m 并输出。在命令行窗口中输入如下代码,并保存为 M 文件。
fID=fopen('t.m','r') %打开文件
data=fread(fID); %读文件
disp((data')) %显示内容
运行后,输出结果如下:
fID =
    6
列 1 至 24
    97    61    91    51    53    44    50    48    44    50    53    44    49    53
    44    51    53    93    59    13    10    98    61    91
列 25 至 48
    49    53    53    52    46    56    56    44    49    53    53    53    46    50
    52    44    49    53    53    53    46    55    54    44
列 49 至 72
    49    53    53    54    46    50    48    44    49    53    53    54    46    54
    56    93    59    13    10    102   105   103   117   114
列 73 至 89
    101   40    49    41    13    10    112   108   111   116   40    97    44    98
    41    13    10

函数 fread() 返回的矩阵的大小和形式是可控的,通过 fread() 函数的第二个输入变量来实现:
a=fread(fID,size)
size 的有效输入大体可分为以下 3 种:
【实例 6】对 t.m 文件进行操作。在命令行窗口中输入如下代码,并保存为 M 文件。
clear all
fID=fopen('t.m','r'); %打开文件
data=fread(fID,4) %读文件
data=fread(fID,[3,2])
运行后,输出结果如下:
fID =
    34
data =
    97
    61
    91
    51
data =
    53    48
    44    44
    50    50

函数 fread() 根据 precision 描述的格式和大小解释文件中的值:
a=fread(fID,size,precision)
precision 包括两部分:
表:常用的精度类型
类型 描述 类型 描述
schar 带符号字符型(8位) uchar 无符号字符型
int8 整型(8位) uint8 无符号整型(8位)
int16 整型(16位) uint16 无符号整型(16位)
int32 整型(32位) uint32 无符号整型(32位)
int64 整型(64位) uint64 无符号整型(64位)
以下为与平台有关的精度类型
char 字符型(8位,有符号或无符号) ushort 无符号整型(16位)
short 整型(16位) uint 无符号整型(32位)
int 整型(32位) ulong 无符号整型(32位或64位)
long 整型(32位或64位) float 浮点数(32位)
single 浮点数(32位) double 浮点数(64位)
float32 浮点数(32位) float64 浮点数(64位)

相关文章