2012-10-23 91 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

相關問題