我有一个Fortran模型,我想强制使用来自R中开发的模型的数据,但是我在两个环境之间传输数据时遇到了麻烦。我在考虑使用.bin文件。
我在R中所做的是使用writeBin
在.bin文件中存储多维数组:
a = seq(1,150,1)
my.array <- array(a, dim=c(10,5,3))
zz <- file("test.bin", "wb")
writeBin (as.vector(my.array),zz)
close(zz)
我可以再次读取R中的.bin文件......
zz <- file("test.bin", "rb")
a1 = readBin(zz,"numeric", n=150)
close(zz)
my.array1 <- array(a1, dim=c(10,5,3))
my.array1
但是,当我尝试使用以下代码在Fortran中打开它时,无法正确识别格式。
PROGRAM playground
implicit none
! Type declarations
real, dimension (5,10,3) :: a
! read binary
open(unit = 10, status='old',file='test.bin', form='formatted', action='read')
read(10,"(f11.3)") a
print*,a
END PROGRAM playground
PROGRAM playground
我假设我在read
命令中使用了错误的格式,但不确定我在哪里出错,因为Fortran对我来说是个新手。有什么建议吗?
答案 0 :(得分:2)
您正尝试将文件打开为form='formatted'
。
格式化表示人类可读,即文本文件。
你绝对需要form='unformatted'
。但默认值为access='sequential'
,这对您不利,请参阅https://stackoverflow.com/a/11570277/721644
您应该使用access='stream'
(或更复杂的access='direct'
)。
链接答案中的代码可以很容易地适应您的问题。只需将数组声明为:
real(rp), dimension (5,10,3) :: a
并且您必须测试rp
的哪个值是正确的。我认为您尝试的默认真实是错误的,您需要
use, intrinsic :: iso_c_binding
integer, parameter :: rp = c_double
使用C双精度实数。
然后只是
open(unit = 10, status='old',file='test.bin', form='unformatted', &
access='stream', action='read')
read(10) a