Matlab的fwrite:跳过的字节会发生什么?

时间:2019-02-27 12:19:21

标签: linux matlab ubuntu fwrite skip

假设我有以下代码:

fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,1,'short',10,'ieee-le')

这将打开一个较早的指定文件,跳过前10个字节,并将1写入后面的两个字节。

但是假设打开的文件之前不存在,那么前10个字节会发生什么?如果要访问其中一个,最终会得到什么,为什么?

2 个答案:

答案 0 :(得分:2)

在这类问题中,找出最简单的方法通常是,如果不太复杂,请自己尝试一下。 现在,您表明您正在使用 Linux ,也许您可​​以在平台上重复测试并查看结果是否匹配。


对于 Windows 平台,skip值:

  • 在第一个要写入的值之前实现
  • 似乎将每个跳过的字节保留为值00(可能是操作系统为文件分配的新值)

示例:

此代码:

fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,1,'short',10,'ieee-le')
fclose(fid)

产生以下文件(在十六进制编辑器中可见): enter image description here

如果要编写的值不止一个:

fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,[1 2 3],'short',10,'ieee-le')
fclose(fid)

在您主动编写的每个00值之前,您仍然可以获得10x short个值: enter image description here


对于新创建的文件就是这种情况。让我们看看现有文件发生了什么:

%% Let's create a file full of `FF`
FFarray = uint8(ones(36,1)*255) ;
fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,FFarray,'uint8')
fclose(fid)

给出: enter image description here

现在通过使用与以前相同的代码(将permission设置为w):

fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,[1 2 3],'short',10,'ieee-le')
fclose(fid)

enter image description here 是的,我们仍然得到同样的东西。现在,这与您指定的权限的MATLAB文档一致:

w =>打开或创建用于写入的新文件。 丢弃现有内容(如果有)。

如果您只是将该权限更改为r+打开文件进行读写。):

fid = fopen(my_filename,'r+','ieee-le','ISO-8859-1');
fwrite(fid,[1 2 3],'short',10,'ieee-le')
fclose(fid)

您仅覆盖未跳过的值: enter image description here

答案 1 :(得分:1)

来自POSIX documentation

  

fseek()函数应允许将文件位置指示符设置为超出文件中现有数据的末尾。如果此刻以后再写入数据,则随后在间隙中读取数据将返回值为0的字节,直到将数据实际写入间隙为止。

因此,假设MATLAB的fwrite使用fseek来跳过再见(很有可能),那么在任何POSIX体系结构上,文件末尾跳过的字节都将用零填充(Linux,苹果系统)。对于Windows(不是POSIX),不一定是这种情况。

在MacOS上进行的快速测试确认了此行为:

fn = 'test.bin';
fid = fopen(fn,'wb');
fwrite(fid,1,'uchar',10);
fclose(fid);
fid = fopen(fn,'r');
fread(fid,Inf,'uchar')
fclose(fid);

输出:

ans =
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     1