【问题标题】:Use Pipe between FORTRAN and C++在 FORTRAN 和 C++ 之间使用管道
【发布时间】:2013-05-18 14:16:20
【问题描述】:

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

我关注 http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx 的 C++ 部分。但对于 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 部分是正确的,因为在控制台上书写需要很多时间! (它甚至比通过文件传递数据还要慢!!!) 任何建议表示赞赏。

【问题讨论】:

标签: c++ fortran pipe


【解决方案1】:

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

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

fort > xxx.txt

在 C++ 方面,如果它只是一种通信方式,您实际上不需要使用 createpipe,您可以使用 stdin。这样就很容易测试了

type xxx.txt | cpp

当一切正常时使用

fort | cpp

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

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

【讨论】:

  • 什么是type xxx.txt | cpp?使用cpp < xxx.txt不是更好吗?
  • 是的,但是操作是在询问管道,所以,我举一个使用管道的例子。 Windows 的问题在于,当有人提到 pipe 时,你想知道他们是指匿名管道,类似于 *nix(上面的示例)还是需要服务器、安全访问等的命名管道。通常是前者,但在极少数情况下,你会得到后者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2014-08-13
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多