4

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

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

4

2 回答 2

2

我会尝试将数据转换TRANSFER()为长字符并使用非高级 i/o 打印它。问题将是您的处理器对记录长度的限制。如果它太短,您最终会在某处出现意外的记录结束标志。此外,您的处理器可能不会按照您想要的方式写入不可打印的字符。

即,类似

character(len=max_length) :: buffer

buffer = transfer(data,buffer)

write(*,'(a)',advance='no') trim(buffer)

我在不可打印字符中看到的最大问题。另请参阅非高级 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
于 2012-10-23T10:18:36.473 回答
1

这更像是对@VladimirF 的评论/补充,而不是新的答案,但我还不能添加这些。您可以先查询预连接的 I/O 单元的位置,然后打开未格式化的连接:

character(1024) :: stdout
inquire(6, name = stdout)
open(11, file = stdout, access = 'stream', action = 'write')

This is probably the most convenient way, but it uses stream access, a Fortran 2003 feature. Without this, you can only use sequential access (which adds header data to each record) or direct access (which does not add headers but requires a fixed record length).

于 2012-10-23T13:38:43.023 回答