如何在R中编写.bin文件并在Fortran中打开它

时间:2016-12-12 13:21:45

标签: r fortran binaryfiles

我有一个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对我来说是个新手。有什么建议吗?

1 个答案:

答案 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