我有一个C++应用程序和FORTRAN应用程序,它们通过文件进行通信。(两个方向)
FORTRAN应用程序正在将数据写入文件,而C++则从文件中读取数据。现在出现了一个新的需求,我必须直接与C++代码形式FORTRAN以及从FORTRAN到C++进行通信(因为文件操作很昂贵)。我在C++端实现了套接字,并尝试在FORTRAN端实现套接字。我没有得到足够的信息在互联网上有关套接字的FORTRAN。
FORTRAN遗留代码是用g77编写的。C++在MFC中。
我知道,我不应该要求在这个论坛上的链接。如果这个问题不属于这个论坛,我在哪里可以问这样的问题?
发布于 2015-02-12 17:49:58
如果通信是单向的,您可以使用命名管道,甚至匿名管道。
与所有进程间的通信一样,也有一些问题。
您最好的选择是使用未格式化的流。这是一个相对较新的特性,在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已经很老了,已经有几年没有被支持了。
https://stackoverflow.com/questions/23825638
复制相似问题