将未格式化的(二进制数据)写入stdout

时间:2012-10-23 09:12:41

标签: io fortran

我想在Fortran 90程序中将未格式化的(二进制)数据写入STDOUT。我正在使用AIX Unix,不幸的是它不允许我将单元6打开为“未格式化”。我想我会尝试在不同的单元号下打开/dev/stdout,但在AIX中不存在/dev/stdout(尽管这种方法在Linux下工作)。

基本上,我想将程序输出直接传递到另一个程序,从而避免使用中间文件,有点像gzip -c。考虑到我上面遇到的两个问题,还有其他方法可以达到这个目的吗?

2 个答案:

答案 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的一项功能。如果没有这个,你只能使用顺序访问(向每个记录添加标题数据)或直接访问(不添加标题但需要固定的记录长度)。