MATLAB FREAD / FWRITE - PullRequest
       37

MATLAB FREAD / FWRITE

3 голосов
/ 09 июня 2009

Я хочу изменить значение пары байтов в большом двоичном файле с помощью команды matlab fwrite. Я пытаюсь открыть файл, используя fopen (имя файла, 'r +', точность) затем прочитайте файл, используя fread (fid, NUM, 'int32') (это все работает). Как только я добираюсь до позиции файла, где я хочу записать (перезаписать) значения следующих байтов, я использую команду: FWRITE (FID, variable_name, 'int32'). Затем я закрываю файл: fclose (fid).

ОК, тогда я возвращаюсь и перечитываю файл, и эти байты не изменились!

Так это не возможно? Или «r +» не подходит?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 09 июня 2009

Из документации на FOPEN :

Если вы открываете файл в режиме обновления (со значением разрешения, которое включает '+'), вы должны назвать fseek или frewind между операциями чтения и записи. За Например, вы не можете назвать Fread с последующим fwrite или fwrite с последующим по фреду, если только вы не позвоните в fseek или Frewind между ними.

Короче, вам нужно позвонить FSEEK , прежде чем позвонить FWRITE . На самом деле, если вам не нужно ничего читать из файла, я бы просто использовал FSEEK вместо вашего звонка на FREAD .

0 голосов
/ 11 апреля 2017

Когда вы читаете, чтобы узнать, какой байт нужно изменить, ведите счет того, сколько байтов вы должны пропустить (4 байта, например, int или float).

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);
...