Проблема чтения бинарных данных MATLAB fseek

MATLAB 7.13.0.564 (R2011b), UBUNTU 12.04 (точный) 64-бит

Я пытаюсь прочитать подмножество (не начиная с начала) 2D-данных из двоичных файлов. Я знаю, что 1 набор 2D-данных составляет 5838952 байта:

>>whos

DATA               5747x127                 5838952  double

Я пытаюсь использовать fseek, чтобы пропустить первые 400 наборов 2D-данных:

fseek(fid,5838952*400,'bof');

а затем прочитайте в следующих 100 наборах данных:

for i = 1:100
    DATA(i,:,:) = fread(fid,[5747 127],'int16');
end

Но код продолжает читать первые 100 наборов 2D-данных, не пропуская первые 400, как я и хотел. Кто-нибудь знает, почему? Благодарить!

редактировать:

If I do

fseek(fid,5838952*400,'bof');
position = ftell(fid) 

Я получил:

position =

     0

person 2one    schedule 20.02.2015    source источник
comment
Вы проверили возвращаемое значение fseek? Из документации: возвращает 0 при успешном выполнении операции. В противном случае возвращается -1.   -  person smn    schedule 20.02.2015
comment
fseek(fid,5838952*400,'bof') анс = -1. Я не знаю, почему это неудачно.   -  person 2one    schedule 20.02.2015
comment
Я читал, что whos возвращает количество байтов, которое каждая переменная занимает в рабочей области, поэтому, возможно, это не соответствует фактическому двоичному файлу! fseek(fid,10,'bof') position = ftell(fid) возвращает ans=0, position=10.   -  person 2one    schedule 20.02.2015
comment
Да точно, смотрите мой ответ. Ваши данные в файле - int16 (2 байта), но двойные (8 байтов) в памяти MATLAB.   -  person smn    schedule 20.02.2015


Ответы (1)


Вы ищете конец файла. Бежать

ferror(fid)

незамедлительно после

fseek(fid,5838952*400,'bof');

Данные в файле - int16, но вы загружаете их как double в MATLAB, поэтому размер в четыре раза больше байтов. Вы должны стремиться:

status = fseek(fid, 5747 * 127* 400 * 2, 'bof')
person smn    schedule 20.02.2015
comment
Спасибо. Это отлично работает: fseek(fid,5838952*400,'bof') ferror(fid) ans = -1 ans = неправильное смещение - после конца файла или последнего записанного символа. status = fseek(fid, 5747 * 127* 400 * 2, 'bof') status = 0 ans = ' ' position = 583895200 - person 2one; 20.02.2015