我有一个代码,我必须在其中执行大量文件I / O,因此,我想以一种非常有效的方式来处理以下问题。为了方便起见,我的代码始终只编写要重新启动文件的真实部分,编码如下:
OPEN(UNIT = 2, FILE = filename, STATUS = 'UNKNOWN', form = 'unformatted')
write(2) CFL
write(2) W
CLOSE(2)
当我在真实分析模式下运行代码时,读取这些文件很简单:
OPEN(UNIT = 2, FILE = filename, STATUS = 'OLD', form = 'unformatted')
read(2) CFL
read(2) W
CLOSE(2)
但是当我在复杂环境中运行时,我必须做一些笨拙的hack:
open(UNIT = funit, FILE = filename, STATUS = 'old', form='unformatted')
#ifdef COMPLEX_ON
read(funit) CFL
read(funit) W_t
CFL_in = CFL
W = W_t
#else
read(funit) CFL_in
read(funit) W
#endif
close(funit)
这意味着现在我需要数据的两个副本,并且如果我像以前一样使用隐式do循环,则可以一次破解一个条目并将其复制到W数组,但这是一种较慢的方法处理I / O。有没有办法告诉fortran我想将实际的二进制数据读入复杂的变量数组中?
谢谢。
如果您的编译器是最新的,甚至声称符合Fortran 2008,则可以使用受支持最少的F2008功能之一,并仅阅读真实内容。
write(2) CFL%re
write(2) W%re
您仍然需要#ifdef
,但不需要另一个数组。但是,无论如何,编译可能很需要创建一个临时数组。
否则,您可以使用普通的旧equivalence
视图将复杂数组视为具有额外维度的真实数组。或存储过程参数的关联也可以这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句