假设我有以下代码:
fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,1,'short',10,'ieee-le')
然后这将打开一个早期指定的文件,跳过前10个字节并将1写入以下两个。
但前十个字节会发生什么,假设打开的文件以前不存在?如果我要访问一个,我最终会得到什么?为什么?
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
在这类问题中,找出答案的最简单方法通常是自己尝试,如果它不是太复杂。现在您表示您正在使用Linux,可能您可以在您的平台上重复测试并查看结果是否匹配。
对于Windows平台,skip
值:
00
(可能是操作系统分配为文件的新值)例子:
这段代码:
fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,1,'short',10,'ieee-le')
fclose(fid)
如果你有多个值要写:
fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,[1 2 3],'short',10,'ieee-le')
fclose(fid)
在你积极写的每个00
值之前,你仍然得到10x short
值:
这是新创建的文件的情况。让我们看看现有文件发生了什么:
%% 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)
现在使用与之前相同的代码(将permission
设置为w
):
fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,[1 2 3],'short',10,'ieee-le')
fclose(fid)
是的,我们仍然得到同样的东西。现在,这与您指定的许可的MATLAB文档一致:
w
=>打开或创建新文件进行编写。丢弃现有内容(如果有)。
如果您只是将该权限更改为r+
(打开文件进行读写)。
fid = fopen(my_filename,'r+','ieee-le','ISO-8859-1');
fwrite(fid,[1 2 3],'short',10,'ieee-le')
fclose(fid)