如何同时读写二进制文件?

3

我想使用MATLAB的fwrite命令更改大型二进制文件中几个字节的值。我的操作步骤是先使用以下代码打开文件:

fopen(filename,'r+',precision);

然后使用以下命令向下读取文件:

fread(fid,NUM,'int32');

一切都有效果。一旦我到达想要写入(覆盖)下一个字节值的文件位置,我使用以下命令:

fwrite(fid,variable_name,'int32');

然后我关闭文件:

fclose(fid);

然后我回去重新阅读文件,这些字节没有改变!

那么这不可能吗?或者使用 'r+' 错误吗?


1
请展示你的代码,这样我们可以更容易地复现。 - MatlabDoug
2个回答

7
fopen文档中得知:
  • 若要读写同一文件:
  • 以包括加号'+'permission值打开文件。
  • 在读写操作之间调用fseekfrewind。例如,不要在调用fread后紧接着调用fwrite,或者在调用fwrite后紧接着调用fread,除非在它们之间调用fseekfrewind
简而言之,在调用fwrite之前需要调用fseek
fid = fopen(filename, 'r+', precision);
data = fread(fid, NUM, 'int32');
fseek(fid, 0, 'cof');
fwrite(fid, variable_name, 'int32');
fclose(fid);

事实上,如果您不需要从文件中实际读取任何内容,只需要移动到文件中的给定位置,我建议您使用fseek代替调用fread。例如:
fid = fopen(filename, 'r+', precision);
fseek(fid, NUM*4, 'bof');
fwrite(fid, variable_name, 'int32');
fclose(fid);

0

当你阅读以了解要更改哪个字节时,请记下你必须跳过多少字节(例如每个int或float占用4个字节)。

bytesToSkip = 0;
not_the_value_you_want = true;
bytesPerValue = 4; %for a float or int

while not_the_value_you_want

...some code here...

  if 'this is it'

  not_the_value_you_want = false; % adapt this to your taste

  else

  bytesToSkip += bytesPerValue;

  end;

...maybe more code here...

end;

在此之后尝试这个:

fileID = fopen('YourFile.bin','w+');
fseek(fileID,bytesToSkip,'bof'); %'bof' stands for beginning of file
fwrite(fileID,newValue);
fclose(fileID);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接