2009-06-08 5 views
3

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

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

Так что это невозможно? Или «r +» неправильно использовать?

Спасибо.

+1

Пожалуйста, покажите свой код, чтобы мы могли воспроизвести проще. – MatlabDoug

ответ

6

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

При открытии файла в режиме обновления (со значением разрешения, которое включает «+»), вы должны вызвать FSEEK или frewind между операций чтения и записи , Например, для вы не можете вызвать fread , за которым следует fwrite, или fwrite следует по fread, если вы не позвоните fseek или между ними.

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

0

Когда вы читаете, чтобы узнать, какой из байтов изменить, учитывайте количество байтов, которые вы должны пропустить (по 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); 
Смежные вопросы