我有一个二进制文件,是由Python代码创建的。该代码脚本化了一堆任务以预处理一组数据文件。我现在希望在Fortran中读取这个二进制文件。二进制文件的内容是点的坐标,格式很简单:点数、x0、y0、z0、x1、y1、z1等。这些二进制文件是使用numpy中的“tofile”函数创建的。到目前为止,在Fortran中我有以下代码:
integer:: intValue
double precision:: dblValue
integer:: counter
integer:: check
open(unit=10, file='file.bin', form='unformatted', status='old', access='stream')
counter = 1
do
if ( counter == 1 ) then
read(unit=10, iostat=check) intValue
if ( check < 0 ) then
print*,"End Of File"
stop
else if ( check > 0 ) then
print*, "Error Detected"
stop
else if ( check == 0 ) then
counter = counter + 1
print*, intValue
end if
else if ( counter > 1 ) then
read(unit=10, iostat=check) dblValue
if ( check < 0 ) then
print*,"End Of File"
stop
else if ( check > 0 ) then
print*, "Error Detected"
stop
else if ( check == 0 ) then
counter = counter + 1
print*,dblValue
end if
end if
end do
close(unit=10)
很不幸,这并不起作用,我得到了一些垃圾数值(例如6.4731191026611484E+212,2.2844499004808491E-279等)。有人能否指点一下如何正确地做到这一点?此外,在Python和Fortran之间可互换地编写和读取二进制文件的好方法是什么——因为这似乎是我应用程序的要求之一。
谢谢
access=stream
:) 我刚意识到你已经在这样做了,所以我暂时删除了我的答案。所以问题是:你确定你的Pythonint
和Fortraninteger
的字节大小是相同的吗?你应该检查两者。如果有一字节的差异,数据的错位将导致读取后的垃圾值。你使用的Fortran编译器是什么?你是如何声明你的integer
变量的?你的Pythonint
具体类型是什么? - Andras Deak -- Слава Україніkind=32
。请使用kind=real32
和kind=real64
(这些常量来自模块iso_fortran_env
https://gcc.gnu.org/onlinedocs/gfortran/ISO_005fFORTRAN_005fENV.html)。它们应该等同于NumPy的float32和float64。 - Vladimir F Героям слава