2015-05-07 104 views
2

是否可以打印東西在屏幕上,並在同一時間,正在打印什麼也寫在一個文件? 現在,我有這樣的事情:打印並寫入一行?

print *, root1, root2 
open(unit=10,file='result.txt' 
write(10,*), root1, root2 
close(10) 

我覺得我在浪費線,使代碼不再,它應該是。其實我是想打印/寫更多的線,這些,所以這就是爲什麼我在尋找一個更清潔的方式來做到這一點。

回答

7

寫入標準輸出和寫入文件是兩個不同的東西,所以你總是需要單獨說明。但是,您不必爲每一行編寫的文件打開和關閉文件。

老實說,我不認爲這是更艱苦的努力:

open(unit=10, file='result.txt', status='replace', form='formatted') 
.... 
write(*, *) "Here comes the data" 
write(10, *) "Here comes the data" 
.... 
write(*, *) root1, root2 
write(10, *) root1, root2 
.... 
close(10) 

這只是一條線比你將不得不每寫聲明反正做多。 如果你真的認爲你的代碼中有太多的寫入語句,這裏有一些你可能會嘗試的想法:

如果你正在Linux或Unix系統(包括MacOS)上運行,你可以編寫一個程序只寫到標準輸出和管道輸出到一個文件中,就像這樣:

$ ./my_program | tee result.txt 

這都將數據輸出到屏幕上,並將其寫入到文件result.txt

或者你可以寫輸出到程序中的文件,並在外部「追蹤」文件:

$ ./my_program & 
$ tail -f result.txt 

我只是另一個想法:如果你真的經常有,你需要將數據寫入到屏幕和文件都問題,你可以放置到一個子程序:

program my_program 
    implicit none 
    real :: root1, root2, root3 
    .... 
    open(10, 'result.txt', status='replace', form='formatted') 
    .... 
    call write_output((/ root1, root2 /)) 
    .... 
    call write_output((/ root1, root2, root3 /)) 
    .... 
    call write_output((/ root1, root2 /)) 
    .... 
    close(10) 
    .... 
contains 
    subroutine write_output(a) 
     real, dimension(:), intent(in) :: a 
     write(*, *) a 
     write(10, *) a 
    end subroutine write_output 
end program my_program 

我將這些值作爲數組傳遞給這裏,因爲這樣可以爲您打印更多的變量提供更多的靈活性。另一方面,您只能使用此子例程來爲其他(integer,character等)或其組合編寫real值,或者您需要仍然有兩個write語句或寫入其他特定的「寫入兩個」例程。