2012-10-23 50 views
3

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

基本上,我想把我的程序直接输出到另一个程序中,这样就避免了一个中间文件,有点像gzip -c那样。考虑到我在上面遇到的两个问题,有没有其他方法可以实现这一点?

+0

FORTRAN unformatted包含额外的头文件数据,至少有些效率低下,如果您的接收程序不是用fortran写的,更不用说烦人了。从这个角度来看,弗拉德米尔的答案(上半部分)很可能就是这样。 – agentp

回答

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

---编辑--- 另一种可能性,尝试使用文件/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 
+0

感谢弗拉基米尔:我喜欢你在/ proc中使用文件描述符的第二个想法。我不想走下TRANSFER的路线,因为我有很多数据可以写,并且不想冒险达到记录长度的处理器相关限制。 – ccbunney

+0

不需要将所有数据填入一个缓冲区。使它合理的大小,并做多个写。你甚至可以使用一个小缓冲区并写入单个值,尽管毫无疑问存在性能交易。 – agentp

+0

这不适合我。有时它可以工作,但有些数据会被破坏。如果缓冲区中有控制字符,它会正确写入吗?并用类似的'transfer(buffer,data)'语句读取? – Jason

1

这更是一个评论/添加到@ VladimirF比新的答案,但我不能添加这些呢。你可以先打听预连接I/O单元的位置,然后打开未格式化的连接:

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

这可能是最方便的方式,但它使用流连接,Fortran 2003的功能。没有这个,你只能使用顺序访问(将标题数据添加到每个记录)或直接访问(不添加标题但需要固定记录长度)。

+0

一个不错的主意,但在AIX下返回的文件名只是一个垃圾字符串。有趣的是,它在Linux中工作,但... – ccbunney

+0

哦,这很奇怪...这是编译器依赖?我使用的(gfortran和ifort)没有任何问题,gfortran甚至提供了非标准例程“isatty”和“ttynam”。 – sigma

+0

系统依赖,我猜。 AIX与Linux有许多微妙和令人生气的方式有点不同...... – ccbunney

相关问题