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

问题描述 投票:6回答:2

假设我有以下代码:

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

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

但前十个字节会发生什么,假设打开的文件以前不存在?如果我要访问一个,我最终会得到什么?为什么?

linux matlab ubuntu fwrite skip
2个回答
1
投票

来自POSIX documentation

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

因此,假设MATLAB的fwrite使用fseek跳过脚(很有可能),那么超过文件末尾的跳过的字节将在任何POSIX架构(Linux,MacOS)上用零填充。 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

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

© www.soinside.com 2019 - 2024. All rights reserved.