0

我正在尝试使用管道方法将大量数据(双数)从 FORTRAN 程序传递到 C++ 程序。

对于 C++ 部分,我关注了http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx 。但对于 FORTRAN 部分(即子处理器),我不知道如何正确写入数据。我是否必须使用WRITE(*,*)C++ 程序在控制台上写入所有数字,然后再读取它?

我写数据的 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 部分是正确的,因为在控制台上书写需要很多时间!(它甚至比通过文件传递数据更慢!!!)任何建议都值得赞赏。

4

1 回答 1

0

您提到了写入文件。您是否考虑过使用 fread 使用 fortran 程序的二进制输出和 C++ 端的二进制输入?由于不涉及解析,因此速度要快得多。如果这仍然很慢,那么管道将无法真正解决您的速度问题。

如果权力坚持你使用格式化的输出和管道,那就这样吧。假设您的 fortran 程序称为 fort,而您的 c++ 程序称为 cpp。检查你的 fortran 输出

fort > xxx.txt

在 C++ 方面,如果它只是一种通信方式,你真的不需要使用 createpipe,你可以只使用标准输入。这样就很容易测试使用

type xxx.txt | cpp

当一切正常使用

fort | cpp

使用 MS 文件/管道处理可能会更快,但您仍然需要将数据读入缓冲区并 sscanf 它是 CI/O 所做的,因此您也可以只使用来自 stdin 的 CI/O 和 scanf。如果您以二进制形式执行此操作,则可以省略整个 scanf 部分。保持标准的好处是您可以在以后很容易地将其移植到 Unix 或其他操作系统。

另一种选择是将 Fortran 程序转换为库并从 C++ 调用它。这样一来,您只需处理数组而不是 I/O。

于 2013-05-18T05:47:28.687 回答