【问题标题】:MATLAB fseek binary data read-in issueMATLAB fseek 二进制数据读入问题
【发布时间】:2015-02-20 13:31:54
【问题描述】:

MATLAB 7.13.0.564 (R2011b)、UBUNTU 12.04(精确)64 位

我正在尝试从二进制文件中读取二维数据的子集(不是从头开始)。我知道 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 个二维数据集,而没有按照我的意愿跳过前 400 个。有谁知道为什么?谢谢!

编辑:

如果我这样做

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

我明白了:

position =

     0

【问题讨论】:

  • 你检查fseek的返回值了吗?来自文档:操作成功时返回 0。否则,它返回 -1。
  • fseek(fid,5838952*400,'bof') ans = -1。不知道为什么不成功。
  • 我读过“whos”返回每个变量在工作区中占用的字节数,所以可能与实际的二进制文件不匹配! fseek(fid,10,'bof') position = ftell(fid) 返回 ans=0, position=10。
  • 是的,看我的回答。您在文件中的数据是 int16(2 个字节),但在 MATLAB 内存中是 double(8 个字节)。

标签: matlab binary fseek


【解决方案1】:

您正在寻找文件的末尾。运行

ferror(fid)

紧接着

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

文件中的数据是 int16,但您在 MATLAB 中加载为 double,因此大小是字节数的四倍。您应该寻求:

status = fseek(fid, 5747 * 127* 400 * 2, 'bof')

【讨论】:

  • 谢谢。这很好用: fseek(fid,5838952*400,'bof') ferror(fid) ans = -1 ans = Offset is bad - 在文件结尾或最后一个字符写入之后。状态 = fseek(fid, 5747 * 127* 400 * 2, 'bof') 状态 = 0 ans = ' ' 位置 = 583895200
猜你喜欢
  • 2013-10-17
  • 1970-01-01
  • 2011-12-24
  • 2013-06-22
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多