我想在Fortran 90程序中将未格式化(二进制)数据写入STDOUT。我正在使用AIX Unix,不幸的是,它不会让我将单元6打开为“未格式化”。我想我会尝试打开/dev/stdout
而不是在不同的单元号下,但在AIX中不存在/dev/stdout
(尽管此方法在Linux下运行)。将未格式化(二进制数据)写入标准输出
基本上,我想把我的程序直接输出到另一个程序中,这样就避免了一个中间文件,有点像gzip -c
那样。考虑到我在上面遇到的两个问题,有没有其他方法可以实现这一点?
我想在Fortran 90程序中将未格式化(二进制)数据写入STDOUT。我正在使用AIX Unix,不幸的是,它不会让我将单元6打开为“未格式化”。我想我会尝试打开/dev/stdout
而不是在不同的单元号下,但在AIX中不存在/dev/stdout
(尽管此方法在Linux下运行)。将未格式化(二进制数据)写入标准输出
基本上,我想把我的程序直接输出到另一个程序中,这样就避免了一个中间文件,有点像gzip -c
那样。考虑到我在上面遇到的两个问题,有没有其他方法可以实现这一点?
我会尝试通过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
---编辑--- 另一种可能性,尝试使用文件/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
这更是一个评论/添加到@ VladimirF比新的答案,但我不能添加这些呢。你可以先打听预连接I/O单元的位置,然后打开未格式化的连接:
character(1024) :: stdout
inquire(6, name = stdout)
open(11, file = stdout, access = 'stream', action = 'write')
这可能是最方便的方式,但它使用流连接,Fortran 2003的功能。没有这个,你只能使用顺序访问(将标题数据添加到每个记录)或直接访问(不添加标题但需要固定记录长度)。
FORTRAN unformatted包含额外的头文件数据,至少有些效率低下,如果您的接收程序不是用fortran写的,更不用说烦人了。从这个角度来看,弗拉德米尔的答案(上半部分)很可能就是这样。 – agentp