我正在努力将二进制文件的一些数据解释从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中自动执行此检查的方法吗?
答案 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);