2014-09-22 53 views
1

在C中,我可以使用標準函數freopenstdout將我的程序的標準輸出重定向到一個文件。我想用fortran做同樣的事情,但是在Google搜索後我找不到類似的功能。它存在嗎?Fortran相當於freopen

如果有人想知道我的用例是什麼,以及爲什麼我不能使用shell重定向輸出,我正在運行MPI程序,並且需要將每個實例的輸出重定向到不同的文件。我不能從程序之外做到這一點,因爲我們的MPI實施不允許這樣做。


編輯: 一個相關的問題如下。假設Fortran代碼調用一個C函數,並且這個C函數調用stdout的freopen到一個不同的文件。在fortran中,隨後的write(*,*),print *write(6,*)會發生什麼?這些文件的輸出是否重定向到文件?

+1

至於你添加的問題 - 你嘗試這個時發現了什麼? – 2014-09-23 05:29:53

+0

那麼,我發現的是非常不相關的,因爲我需要可移植性和可移植性由標準來保證。我可能需要知道如何根據fortan標準處理文件描述符,但我不確定這些影響可能是什麼。不過,你應該得到一個答案......是的,它的工作。所有後續輸出按預期重定向到文件。 – Spiros 2014-09-23 07:58:31

回答

2

如果你有先見之明寫沿

write(write_unit,*) stuff_to_write 

行所有write聲明這將是非常簡單的,你可以簡單地連接到write_unit文件而不是stdout。我想你已經知道,或者你不會問這個問題。如果您write語句的形式爲

write(*,*) 

print * 

那麼你或許可以重定向輸出從編譯器的幫助不大。例如,英特爾Fortran會將指向*的輸出發送到控制檯,除非程序發現自己在變量FOR_PRINT設置爲某個文件或其他文件的名稱的環境中執行,在這種情況下,write(*,*)將寫入該文件。我希望其他編譯器具有類似的功能。

如果你的代碼的預期使用

write(6,*) 

該單位6點stdout你可以在一個文件

open(unit = 6, file = 'stdout_redirect', status = 'new') 

打開單元6對於任何更多你最好告訴我們,你寫語句看起來像你正在使用的編譯器。

編輯

在OP的編輯問題後。這是一個評論比答案更多,但我很囉嗦......

不幸的是,從可移植性的角度來看,許多Fortran程序與底層計算機系統的交互沒有在標準中定義。你的問題在哪裏輸出發送到單位*去是一個例子;最新的(2008)標準指出,它必須與內在模塊iso_fortran_env中的命名常量output_unit確定的單位相同。但是它並沒有說到stdout(在沒有stdout的系統上已經有很多Fortran實現),並且它沒有指定如何重定向該輸出,或者即使可以這樣做。輸出重定向是平臺問題,而不是Fortran。正如我們發現英特爾Fortran可以使用環境變量重定向輸出,顯然Cray Fortran不能。

最新標準完全沒有提到文件描述符的主題,我不確定它是Fortran已知的概念。

對於I/O使用*實質上是說它取決於編譯器/運行時系統,輸入來自輸出並轉到輸出。如果你想要可移植性,你必須控制並使用特定的單元標識。就我個人而言,我認爲你應該在下面的評論中採納@喬治的建議。

+2

如果您沒有足夠的遠見來使用單位編號的變量,請咬住子彈並返回並修復它。其他任何事情都是在mpi下要求麻煩。 – agentp 2014-09-22 17:52:14

+0

恩,挺@george。並感謝您提供明確的,我不認爲明確的內容。 – 2014-09-22 17:54:59

+0

非常感謝您的提示。我正在使用的代碼庫非常大(大約5萬行),風格和實踐方面非常不同。關於如何打印東西沒有普遍的一致意見,主要是因爲只有診斷消息被打印到標準輸出(並且診斷消息被認爲沒有什麼相關性)。我看到你的解決方案,並認爲它們都不適合我的情況,原因在於沒有這樣做的標準方式。我針對的編譯器是GCC和Cray。 – Spiros 2014-09-22 23:36:12