我想在 Fortran 90 程序中将未格式化(二进制)数据写入 STDOUT。我使用的是 AIX Unix,不幸的是它不允许我将单元 6 打开为“未格式化”。我想我应该尝试在不同的单元号下打开
/dev/stdout
,但是 /dev/stdout
在 AIX 中不存在(尽管此方法在 Linux 下有效)。
基本上,我想将程序输出直接通过管道传输到另一个程序中,从而避免产生中间文件,有点像
gzip -c
那样。考虑到我上面遇到的两个问题,还有其他方法可以实现这一目标吗?
我会尝试将数据通过
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
这更多的是对@VladimirF的评论/补充,而不是新的答案,但我还不能添加这些。您可以先查询预连接的I/O单元的位置,然后打开未格式化的连接:
character(1024) :: stdout
inquire(6, name = stdout)
open(11, file = stdout, access = 'stream', action = 'write')
这可能是最方便的方法,但它使用流访问,这是 Fortran 2003 的一项功能。如果没有这个,您只能使用顺序访问(向每条记录添加标头数据)或直接访问(不添加标头但需要固定的记录长度)。
!Use FPUT and FGET for binary I/O as following subroutines:
subroutine stdiR4(byteXX)
real*4 byteCX,byteXX
character*4 charCX
equivalence(byteCX,charCX)
do i=1,4 ! 4,1,-1
call FGET(charCX(i:i))
enddo
byteXX = byteCX
end
subroutine stdoR4(byteXX)
real*4 byteCX,byteXX
character*4 charCX
equivalence(byteCX,charCX)
byteCX = byteXX
do i=1,4 ! 4,1,-1
call FPUT(charCX(i:i))
enddo
end
!Similar for other data types.(change 1:2 lines and 4)
!For data array may use following subroutine:
subroutine stdpR4(byteXX,nx)
real*4 byteXX(nx)
do i=1,nx
call stdoR4(byteXX(i))
enddo
end