matlab 环境下二进制文件操作

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 函数详解

  1. 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 文件是不同的。

data1

data2

图片效果不太好,自己做一遍体会一下。

- 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 为空字符串。
  1. 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')
  1. 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;

运算结果

  1. 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’^

precision 中的 source 和 output 的取值范围

这里写图片描述

这里需要注意的是。当未指定 skip 参数时,ubit8 or uint8 是等价的,bit16 与 int16 是等价的。但是如果指定了 skip 则有所区别。

 skip :表示每次读取操作后指针跳过的**字节**数,默认为0。当 precision 指定 ubitn 或 bitn 时,skip 的单位不再是字节而是 bit。

 当与 fopen 函数 'N * source '等形式联合使用时,可以实现连续读取 N 组数据、跳过 skip 字节的功能。
- count:成功读入元素的数目。
  1. fwrite:将数据写入二进制文件。

    • 调用方式:
    • fwrite(fid,a)
    • fwrite(fid,a,precision)
    • fwrite(fid,a,precision,skip)
    • fwrite(fid,a,precision,skip,machineformat)
    • count = fwrite(…)
    • 参数解释:
    • precision:这里当然只能指定一种输出类型。
  2. fclose:用来关闭一个或所有打开的文件。

    • 调用方式:
    • fclose(fid)
    • fclose(‘all’)
    • status = fclose(…)

注意,关闭文件返回的状态,0 表示成功,而 -1 表示失败

  1. feof:
    status = feof(fid)
    feof 函数作用是查看上一步文件操作是否设置了文件结束符。如果文件结束符 (end-of-file indicator) 被设置,则返回值 status 为 1,否则返回 0 。

所谓设置文件结束符是指:执行了读操作,并且将文件指针移动到了文件末尾。

  1. ferror:返回进行文件 I/O 操作时发生的错误信息。
    • 调用方式:
    • message = ferror(fid)。返回最近一次 I/O 操作时发生的错误,如果没有则为空。
    • [message,errnum] = ferror(fid)。除了返回错误信息外还返回错误的个数。
    • […] = ferror(fid,’clear’)。clear 清除操作过程中的错误。

其他二进制文件操作

matlab 功能强大可以广泛运用于各个领域,但是我经历有限,与我研究方向没有太大关系的内容只能舍弃或者略过,请见谅。如果要看更详细的内容,可以看这本书,或者自行查阅帮助文档。

  1. imfinfo:该函数用来读取图像文件的信息。
  2. saveas:该函数可以方便地将 matlab 的图形窗口保存称为图像文件。类似功能的还有 print 函数。
  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半美人

动力源于鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值