将未格式化(二进制数据)写入标准输出

问题描述 投票:0回答:3

我想在 Fortran 90 程序中将未格式化(二进制)数据写入 STDOUT。我使用的是 AIX Unix,不幸的是它不允许我将单元 6 打开为“未格式化”。我想我应该尝试在不同的单元号下打开

/dev/stdout
,但是
/dev/stdout
在 AIX 中不存在(尽管此方法在 Linux 下有效)。

基本上,我想将程序输出直接通过管道传输到另一个程序中,从而避免产生中间文件,有点像

gzip -c
那样。考虑到我上面遇到的两个问题,还有其他方法可以实现这一目标吗?

io fortran
3个回答
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

1
投票

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

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

这可能是最方便的方法,但它使用流访问,这是 Fortran 2003 的一项功能。如果没有这个,您只能使用顺序访问(向每条记录添加标头数据)或直接访问(不添加标头但需要固定的记录长度)。


0
投票
!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
© www.soinside.com 2019 - 2024. All rights reserved.