确定二进制文件Matlab中一行的字节数

时间:2014-06-09 17:03:03

标签: matlab fortran binaryfiles

我正在努力将二进制文件的一些数据解释从Fortran导入MATLAB,并且遇到了一些问题。

在Fortran文件中,我正在执行以下检查

CHARACTER*72          PICTFILE
CHARACTER*8192        INLINE
INTEGER               NPX
INTEGER               NLN
INTEGER               BYTES
c  This is read from another file but I'll just hard code it for now
NPX = 1024
NLN = 1024
bytes=2
      open(unit=10, file=pictfile, access='direct', recl=2*npx, status='old')
        read(10,rec=nln, err=20) inline(1:2*npx)
        go to 21
20      bytes=1
21      continue
      close(unit=10)

其中nln是要读取的文件中的行数,npx是每行中包含的整数数。该检查基本上确定这些整数中的每一个是1字节还是2字节。我很好地理解了Fortran代码,但现在我需要弄清楚如何在MATLAB中执行此检查。我已经尝试在文件上使用fgetl命令,然后读取包含的字符的长度,但长度似乎永远不会超过4或5个字符,即使每个整数是1个字节,长度也应该在1000左右。< / p>

有人知道我可以在MATLAB中自动执行此检查的方法吗?

2 个答案:

答案 0 :(得分:1)

所以我们想到的是检查只是为了查看文件是否正确。在Matlab中,这可以作为

完成
fullpath=which(file);  %extracting the full file path
s=dir(fullpath);  %extracting information about hte file

fid=fopen(file_name,'r');  %opening image file

if s.bytes/NLN==2*NPX  %if the file is NLN*NPX*2  bytes
    for n=1:NLN  %for each line

        dn(n,:) = (fread(fid, NPX, '*uint16','b'))';  %reading in lines into DN

    end
elseif s.bytes/NLN==NPX  %Else if the file is NLN*NPX bytes
    for n=1:NLN  %for each line

        dn(n,:) = (fread(fid, NPX, '*uint8','b'))';  %reading in lines into DN

    end
else %If the file is neither something went wrong
    error('Invalid file.  The file is not the correct size specified by the SUM file')
end

其中file包含文件名,nln包含行数,npx包含列数。希望这可以帮助任何可能有类似答案的人,但要注意,因为只有当您的文件只包含每个条目具有相同字节数的数据时,这才会起作用,并且如果您知道应该有的条目总数! / p>

答案 1 :(得分:0)

一般来说,二进制文件没有行长;只有文本文件有行长度。 MATLAB的getl将会读取,直到找到换行符的二进制等效值。然后删除它们并返回结果。另一方面,二进制文件应读取长度为2*npx的块并返回结果。看起来您希望使用fread来获取这样的数据块:

inline = fread(fileID,2 * npx)

您的fortran代码要求阅读记录nln。如果您共享的代码从第一个开始读取所有记录并进行处理,那么可以将上面的代码放在循环for nln=1:maxValue中。但是,如果您确实想要将记录nln拉出来,则首先需要fseek到该位置:

fseek(fileID, nln*2*npx, -1);
inline = fread(fileID,2*npx)

所以你会得到以下内容:

要么循环阅读它们:

fileID = fopen(pictfile);
nln = 0;
while ~feof(fileID)
   nln = nln+1;
   inline = fread(fileID,2*npx);
end
fclose(fileID);

或只挑选数字`nln记录:

fileID = fopen(pictfile);
nln = 7;
fseek(fileID, nln*2*npx, -1);
inline = fread(fileID,2*npx);   
fclose(fileID);