我想在Fortran 90程序中将未格式化的(二进制)数据写入STDOUT。我正在使用AIX Unix,不幸的是它不允许我将单元6打开为“未格式化”。我想我会尝试在不同的单元号下打开/dev/stdout
,但在AIX中不存在/dev/stdout
(尽管这种方法在Linux下工作)。
基本上,我想将程序输出直接传递到另一个程序,从而避免使用中间文件,有点像gzip -c
。考虑到我上面遇到的两个问题,还有其他方法可以达到这个目的吗?
答案 0 :(得分:1)
我会尝试将数据按TRANSFER()
转换为长字符,并使用非进位i / o进行打印。问题将是您的处理器对记录长度的限制。如果它太短,你最终会在某处意外结束记录。此外,您的处理器可能无法按照您希望的方式编写不可打印的字符。
,比如
character(len=max_length) :: buffer
buffer = transfer(data,buffer)
write(*,'(a)',advance='no') trim(buffer)
我在不可打印的字符中看到的最大问题。另请参阅A suprise with non-advancing I/O
<强> --- --- EDIT 强>
另一种可能性,尝试使用文件/proc/self/fd/1
或/dev/fd/1
试验:
open(11,file='/proc/self/fd/1',access='stream',action='write')
write(11) 11
write(11) 1.1
close(11)
end
答案 1 :(得分:1)
这更像@VladimirF的评论/补充而不是新答案,但我还不能添加。您可以先查询预连接的I / O单元的位置,然后打开未格式化的连接:
character(1024) :: stdout
inquire(6, name = stdout)
open(11, file = stdout, access = 'stream', action = 'write')
这可能是最方便的方式,但它使用了流访问,这是Fortran 2003的一项功能。如果没有这个,你只能使用顺序访问(向每个记录添加标题数据)或直接访问(不添加标题但需要固定的记录长度)。