2011-10-20 162 views
9

目前,我使用的shell命令行使用非标准系统固有的程序(类似的Fortran 2008 EXECUTE_COMMAND_LINE征)从我的FORTRAN程序调用:执行命令行并返回命令输出

CALL SYSTEM(commandStr) 

其中commandStr是包含我要执行的shell命令的字符串。目前,我不知道直接返回commandStr的输出,但只返回它的返回状态。所以,我现在正在做的是将输出写入文件,然后从Fortran程序中读取文件。例如:

CALL SYSTEM('sed ''s/,//g'' myFile > dummyFile') 

如果我想从myFile中删除逗号。然后我使用OPEN和READ来获取dummyFile的内容。

这工作得很好,但我很关心从磁盘写入/读取文件,尤其是如果我在长循环内执行此操作,并且commandStr输出很大。有没有办法将commandStr输出重定向到我可以直接从Fortran程序访问的内存缓冲区(而非硬盘)(可能通过特定的UNIT号码)?

+0

如果输出很大,将它存储到文件是否更有意义? – Rook

+0

我想这对代码没有什么影响 - 我唯一担心的部分是频繁进出磁盘的I/O影响程序效率。是否有理由将它存储到文件中,我错过了什么? – milancurcic

+1

那么,从我的观点来看,这只是一个实际问题。如果数据量不是很多,那么将其存储到文件中并不重要。它是大量的数据,我在当前正在运行的程序中重用它,这是我希望它成为内存的最后一个地方。我需要内存来存储“解析”该文件的结果,然后对这些文件进行处理。这可能可以更好地解释,但我认为你明白了。 – Rook

回答

1

如果这是在POSIX环境中,库函数popen()也可能可用。

iunit = popen ('sed ''s/,//g'' myFile', 'r') 

查看Fortran环境的文档,因为我不确定将I/O连接到Fortran的语义。如果它类似于C运行时库,则文件连接还需要一个特殊功能来关闭它,pclose()

+1

你可以通过ISO_C_Binding使用Posix的东西,有一个项目涉及到:http://sourceforge.net/projects/fortranposix/ – haraldkl