将大量数据从FORTRAN传递到C ++

将大量数据(双数)从FORTRAN程序传递到C ++程序的最佳和最有效的方法是什么? 现在我正在使用二进制文件,但速度不够快!

我试过管道。 我关注了C ++部分的http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx 。 但对于FORTRAN部分(子处理器),我不知道如何正确写入数据。 我是否必须像WRITE(*,*) AllTheNumbers一样在控制台上WRITE(*,*) AllTheNumbers ? 因为在控制台上书写需要花费很多时间!

我的FORTRAN代码写入数据:

  DO 281 I=1,NDOF DO 280 J=1,UBW IF (S(I,J).NE.0) THEN WRITE (*, 2770) I,(J+I-1) WRITE (*,2760) (S(I,J)) ENDIF 280 CONTINUE 281 CONTINUE 

最快的方法是使其成为一个混合语言程序。 在一个(例如,Fortran)中生成数字,并从该语言调用另一个(例如,C ++)。 使用Fortran的ISO C绑定,调用C是Fortran语言标准的一部分。 许多Fortran编译器都支持这一点。 在C ++端使用“extern C”。 传递一系列双打应该很容易。

编辑:如果您继续使用IO方法传输信息,您可能应该将信息作为二进制数据传输。 您的示例Fortran代码使用格式化的IO …将数字的内部二进制表示转换为人类可读的字符很慢。 在您的Fortran open语句中使用: access='stream', form='unformatted' 。 不要在写入时使用格式。

使用二进制文件可能是最慢的方式。 之前遇到过这个问题:

https://en.wikipedia.org/wiki/Inter-process_communication

考虑创建一些共享内存。 c程序“创建它”,并将数据写入其中,并调用fortran子程序。 fortran程序’映射’共享内存,并处理它并退出。 然后c程序破坏内存并退出。

这里答案的一个小变体: 将未格式化的(二进制数据)写入stdout ,说明重复使用小缓冲区。

  real(kind=8) :: x(256) ! note real(kind=8) is "probably" an 8 byte float. ! but not strictly guaranteed in fortran. character(len=2048):: buffer ! 2048 == 256*8 do j=1,1000 do i = 1,256 x(i)=(i-1)**2+j*256 enddo buffer=transfer(x,buffer) write(*,'(a)',advance='no')buffer enddo end 

和python代码来读取它,仅举例来说。 (python struct模块使它比c ++更好,我认为调试这些东西)

 import subprocess import struct p=subprocess.Popen('./transfer',stdout=subprocess.PIPE) a=" " while a!="": a=p.stdout.read(8) if a!="" : print struct.unpack('d',a) 

在写这样的时候,我从来没有遇到过“不可打印的角色”的问题。 你不能使用这个技巧来读取fortran中的stdin,因为随机字符串被解释为EOF。