我有一个C ++应用程序和FORTRAN应用程序,它们通过文件进行通信。 (两个方向)
FORTRAN应用程序正在将数据写入文件,而C ++正在从文件中读取数据。 现在出现了一个新的要求,我必须用C ++代码格式FORTRAN和从FORTRAN到C ++直接进行通信(因为文件操作很昂贵)。 我在C ++端实现了socket,并尝试在FORTRAN端实现套接字。我是 没有在互联网上获得关于FORTRAN套接字的足够信息。
FORTRAN遗留代码是用g77编写的。 C ++在MFC中。
我知道,我不应该在这个论坛上要求链接。如果这个问题不属于这个论坛,我可以在哪里提出这样的问题?
答案 0 :(得分:0)
如果通信只是单向通信,则可以使用命名管道甚至是匿名管道。
与所有进程间通信一样,有一些问题。
您最好的选择是使用未格式化的流。这是Fortran 2003中引入的一个相对较新的功能,但所有主要编译器都支持它。所以,用
打开你的文件 OPEN(20,file="myfifo",access="stream",form="unformatted",status="old",action="write")
并使用
之类的语句写入 WRITE (20) A
为什么没有格式化流?
首先,未格式化:你写的速度在你的情况下很重要。将数字转换为十进制并再次返回需要花费大量CPU周期,并且可能也会失去准确性。
其次,流:Fortran使用未格式化I / O的常规实现使用记录标记 - 记录显示记录长度之前的标记,记录显示相同信息的标记。
运行时系统如何知道它要写的记录有多长?嗯,事实并非如此。因此,常见的实现是编写虚拟记录标记,写入记录(并了解它的长度),写入尾随标记,搜索第一个标记,覆盖虚拟记录标记,然后继续。这对命名管道不起作用 - 你不能在那里寻找。如果你还在缓冲区内,你可能会很幸运,但你不能依赖它。
关于编译器:如果与旧g77代码兼容是一个问题,请使用gfortran。它支持ACCESS="STREAM"
并且具有g77的大部分扩展。 g77已经过时了很长时间没有得到支持。