Fwrite Матлаба: Что происходит с пропущенными байтами? - PullRequest
0 голосов
/ 27 февраля 2019

Предположим, у меня есть следующий код:

fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,1,'short',10,'ieee-le')

Тогда это откроет ранее указанный файл, пропустит первые 10 байтов и запишет 1 в следующие два.

Но что происходит?в первые 10 байтов, предполагая, что открытый файл не существовал раньше?Если бы я получил к нему доступ, что бы я в итоге получил и почему?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

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

Функция 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);

output:

ans =
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     1
0 голосов
/ 27 февраля 2019

В таких вопросах самый простой способ выяснить это, как правило, попробовать сами, если это не слишком сложно.Теперь вы указали, что используете Linux , возможно, вы можете повторить тест на своей платформе и посмотреть, соответствуют ли результаты.


Для Windows платформа,skip значение:

  • реализовано до Первое записываемое значение
  • , кажется, оставляет каждый пропущенный байт со значением 00 (вероятно, чтоОС назначить в качестве нового значения для файла)

Примеры:

Этот код:

fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,1,'short',10,'ieee-le')
fclose(fid)

Создает следующееfile (видно в шестнадцатеричном редакторе): enter image description here

И если у вас есть более одного значения для записи:

fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,[1 2 3],'short',10,'ieee-le')
fclose(fid)

Вы все равно получаете 10x 00 значения перед каждым short значение, которое вы активно пишете: enter image description here


Это был случай для вновь созданного файла.Давайте посмотрим, что происходит с существующим файлом:

%% 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)

, что дает: enter image description here

Теперь, используя тот же код, что и раньше (с permissionустановить w):

fid = fopen(my_filename,'w','ieee-le','ISO-8859-1');
fwrite(fid,[1 2 3],'short',10,'ieee-le')
fclose(fid)

enter image description here Да, мы все равно получаем то же самое.Теперь это согласуется с документацией MATLAB для указанного вами разрешения:

w => Открыть или создать новый файл для записи. Отменить существующее содержимое , если есть.

Если вы просто измените это разрешение на r+ ( Открыть файл для чтения и записи. ):

fid = fopen(my_filename,'r+','ieee-le','ISO-8859-1');
fwrite(fid,[1 2 3],'short',10,'ieee-le')
fclose(fid)

Вы перезаписываете только пропущенные значения: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...