[英]Use Pipe between FORTRAN and C++
我试图使用管道方法将大量数据(双数)从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部分不正确,因为在控制台上编写会花费很多时间! (它甚至比通过文件传递数据还要慢!!!)任何建议都值得赞赏。
您提到写入文件。 您是否考虑过使用fortran程序的二进制输出以及使用fread在C ++端使用二进制输入? 由于不涉及解析,因此速度明显加快。 如果那仍然很慢,那么管道将无法真正解决您的速度问题。
如果坚持要使用格式化的输出和管道,那么就这样吧。 假设您的fortran程序称为fort,而您的c ++程序cpp。 检查您的fortran输出
fort > xxx.txt
在C ++方面,如果它只是一种通信方式,则实际上并不需要使用createpipe,而只需使用stdin。 这样很容易测试使用
type xxx.txt | cpp
当一切正常时使用
fort | cpp
使用MS文件/管道处理可能会更快,但是您仍然需要将数据读入缓冲区并对其进行sscanf扫描(这是CI / O的作用),因此您也可以仅使用stdin中的CI / O和scanf。 如果以二进制形式执行此操作,则可以忽略整个scanf部分。 保留标准内容的优点是,您以后可以很轻松地将其移植到Unix或其他操作系统。
另一种选择是将Fortran程序转换为库,然后从C ++调用它。 这样,您只会搞乱数组而不是I / O。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.