假设我有以下代码:
fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,1,'short',10,'ieee-le')
这将打开一个较早的指定文件,跳过前10个字节,并将1写入后面的两个字节。
但是假设打开的文件之前不存在,那么前10个字节会发生什么?如果要访问其中一个,最终会得到什么,为什么?
答案 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)
如果要编写的值不止一个:
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)
答案 1 :(得分:1)
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