2014-11-04 88 views
0

我有一個Fortran 95的程序,在這種形式寫一個數組文件:我想編輯我的FORTRAN生成FORTRAN

do temp = 1, temp_final 
    do MC = 1, N_MC 
    do x = 0, N 
     do y = 0, M 
     write(1,*) x, y, array(x,y) 
     enddo 
    enddo 
    enddo 
    write(1,*) T 
    T = T - temp*factor 
enddo 

在我的計劃,我將這些值到一個文件,但之間兩個溫度值,我寫了不止一次(但是N_MC次)x,y數組(x,y)值,因爲它們在MC循環內,上升到N_MC步。由於文件只是生成的,並且程序需要很長時間才能運行,因此如果您可以使用任何技術來編輯已生成的文件並只保留第一組值並將其傳送到另一個文件或編輯父文件,並保持變化。

我的文件看起來像這樣

Temp 0.69999999999999998 !(initial value) 
     0   0 -1.0000000000000000  
     0   1 -1.0000000000000000  
     0   2 -1.0000000000000000  
     0   3 1.0000000000000000  
     0   4 1.0000000000000000   
     1   0 -1.0000000000000000  
     1   1 1.0000000000000000  
     1   2 1.0000000000000000  
     1   3 -1.0000000000000000  
     1   4 -1.0000000000000000   
     2   0 -1.0000000000000000  
     2   1 1.0000000000000000  
     2   2 -1.0000000000000000  
     2   3 1.0000000000000000  
     2   4 1.0000000000000000   
     3   0 -1.0000000000000000  
     3   1 -1.0000000000000000  
     3   2 1.0000000000000000  
     3   3 -1.0000000000000000  
     3   4 -1.0000000000000000  

     0   0 1.0000000000000000  
     0   1 -1.0000000000000000  
     0   2 1.0000000000000000  
     0   3 1.0000000000000000  
     0   4 -1.0000000000000000   
     1   0 1.0000000000000000  
     1   1 1.0000000000000000  
     1   2 1.0000000000000000  
     1   3 -1.0000000000000000  
     1   4 -1.0000000000000000   
     2   0 -1.0000000000000000  
     2   1 1.0000000000000000  
     2   2 -1.0000000000000000  
     2   3 1.0000000000000000  
     2   4 1.0000000000000000   
     3   0 -1.0000000000000000  
     3   1 -1.0000000000000000  
     3   2 1.0000000000000000  
     3   3 -1.0000000000000000  
     3   4 -1.0000000000000000 
     ..........  
     N_MC-2 times (as two sets are already shown) !(after that there is new temp having new array values) 

Temp 0.59999999999999998 ! like this, I am having array values for diff. temp 
. 
. 
. 
Temp 0.09999999999999998 !(final vaule) 

我想保持第一組值不僅沒有經過臨時的連續值之間的.......... N_MC時間值。

我不知道如何調用一個文件,並刪除特定的部分,我不想再保存它。

NB

欲僅傳送第一組值0-3,0-9的,陣列(I,J)

 0   0 -1.0000000000000000  
     0   1 -1.0000000000000000  
     0   2 -1.0000000000000000  
     0   3 1.0000000000000000  
     0   4 1.0000000000000000   
     1   0 -1.0000000000000000  
     1   1 1.0000000000000000  
     1   2 1.0000000000000000  
     1   3 -1.0000000000000000  
     1   4 -1.0000000000000000   
     2   0 -1.0000000000000000  
     2   1 1.0000000000000000  
     2   2 -1.0000000000000000  
     2   3 1.0000000000000000  
     2   4 1.0000000000000000   
     3   0 -1.0000000000000000  
     3   1 -1.0000000000000000  
     3   2 1.0000000000000000  
     3   3 -1.0000000000000000  
     3   4 -1.0000000000000000 
     ! Not after that for Temp = 0.6999999999990 

到單個溫度的文件。

+0

它不清楚你想要保留什麼,但無論如何作爲一個通用原則(不管語言)從文件中刪除某些內容來重寫整個文件,省略你想要刪除的內容。對於這個例子,我懷疑你最好的辦法是簡單地在內存中保存你需要的內容,並且每次都重寫整個文件。 – agentp 2014-11-04 13:28:12

+0

@george文件非常大。 – 2014-11-04 13:38:00

+0

如果你在一個類似Linux的平臺上熟悉諸如'grep','split','cut'等實用工具,它們都可以用來獲取文件中的位。如果你在類似Windows的平臺上查找本地等價物。 – 2014-11-04 14:19:56

回答

0

當您關閉並重新打開一個現有的Fortran文件時,您可以說哪裏定位第一次寫入。

open(unit, action='write', position='append') 

末追加新的寫操作,而

open(unit, action='write', position='rewind', status='replace') 

將清除現有內容並從頭開始寫。

+0

你好,歡迎在這個網站上。請務必閱讀幫助,並熟悉常見的答案和格式功能。我會在你的第一篇文章中做一些基本的格式化,但在我看來,似乎還不清楚這應該如何解決問題。 – 2014-11-04 21:20:01

0

在我的理解,你知道你想要的到底有多少線,以保持(N_MC*N*M?),爲了讓您可以使用我們的答案起見,我們假設你想保持

KeepLines=N_MC*N*M 

你可以做什麼,然後呼籲有以下開放式的語句讀取語句,並馬上寫聲明:

open (file="/path/yourBigFile", unit=13, access="sequential", status="old", action="read") 
open(unit=12, file="/path/yourSmallerFile", status="new", position="append", action="write") 
do i=0,KeepLines-1 !!Watch out for indexes here and be sure to have defined xx,yy, arr 
    read(13,*) xx,yy,arr 
    write(12,*) xx,yy,arr 
enddo 

如果你需要的不僅是第一個塊,但所有不同的塊這種做法是很容易普及:只是把溫度一做循環兩位開放的政治家之間併爲你的較小文件的名稱創建一個數組,以便在第二個公開聲明中可以說類似file=name(temp)

相關問題