我想在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