2017-09-23 67 views
0

追加現有的文件是否有可能將其追加數據之前刪除的文件嗎?寫的方式覆蓋或用Fortran

OPEN(61,file="file.txt",action='write',position='append') 
    WRITE(61,*)f(i,j) 
    CLOSE(61) 

這將創建file.txt並在其中附加值f(i,j)。整個設置在裏面做循環。但是如果我下次運行相同的代碼,它會從之前寫入的最後一個值開始追加。 我想徹底刪除該文件內容它開始追加每次運行時的數據之前。可能嗎?

下面是一個簡單的測試程序:

program test 
    double precision f 
    dimension f(10,10,10) 
    integer i,j,k 
    character*500 ofile 
    Do k=1,5 
    do i=1,2 
    do j=1,2 
    f(i,j,k)= i+10d0*j+k 
    WRITE(ofile,'(A,F4.2,A,F4.2,A)')'file',i*1d0,'_',j*1d0,'.dat' 
    OPEN(61,file=ofile,action='write',position='append') 
    WRITE(61,*)k,f(i,j,k) 
    enddo 
    enddo 
    enddo 
    CLOSE(61) 
    stop 
    end 

在第一次運行的輸出cat file1.00_1.00.dat

 1 12.000000000000000 
     2 13.000000000000000 
     3 14.000000000000000 
     4 15.000000000000000 
     5 16.000000000000000 

在第二輪開始向最後再次cat file1.00_1.00.dat附加:

 1 12.000000000000000  
     2 13.000000000000000  
     3 14.000000000000000  
     4 15.000000000000000  
     5 16.000000000000000  
     1 12.000000000000000  
     2 13.000000000000000  
     3 14.000000000000000  
     4 15.000000000000000  
     5 16.000000000000000 

我想避免第二種情況。每次我運行,它應該給沒有運行之前刪除的文件,

 1 12.000000000000000 
     2 13.000000000000000 
     3 14.000000000000000 
     4 15.000000000000000 
     5 16.000000000000000 

注:我必須打開裏面的文件做環路格式文件名以做循環語法。 一個簡單的解決方案是在運行之前每次移除所有輸出文件。

+0

你的意思是_replace_?但是你也可以在開始時定位,所以你需要選擇'append'嗎? – francescalus

+2

只是刪除'position ='append'',默認是覆蓋。 – agentp

+0

@francescalus追加的原因是在同一個文件中寫入所有f(i,j)與do循環i,j繼續。基本上我想停止代碼並再次運行,然後它應該寫入去除之前寫入的所有內容。 –

回答

1

你不得不與其他用戶討論後,我只是覺得,(如前所述),你在這裏過於複雜的事情。

下面的代碼(未經測試並使用您格式化...)應該給你你想要的東西。如果你想用文件名做一些花哨的事情(這在討論中有點不清楚),那麼你可能需要做其他的事情。

program test 
    double precision f 
    dimension f(10,10) 
    integer i,j 

    OPEN(61,file="file.txt",action='write',status='replace') 
    do i=1,2 
    do j=1,2 
    f(i,j)= i+10d0*j 
    WRITE(61,*) f(i,j) 
    enddo 
    enddo 
    CLOSE(61) 

    stop 
    end 

這會給你總是你file.txt在每次運行的願望輸出。因此,你打開文件一次(替換任何以前的版本),編寫f多少時間作爲雙循環迭代(寫在每個記錄f之後的前一個在同一個文件中,我認爲這裏是你在哪裏混淆與append),並關閉文件。

編輯

有了新的例子,你張貼的問題,現在已經很清楚。如果您可以在原始文章中進行解釋,這將有助於避免大量時間。

解決此問題的一種方法是在循環內添加一個條件,在該條件下它檢查循環的第一次迭代或不循環(對於每個值k)。還要注意,k循環需要迭代最快的(內循環)。

program test 
    double precision f 
    dimension f(10,10,10) 
    integer i,j,k 
    character*500 ofile 

    do i=1,2 
    do j=1,2 
    do k=1,5 
     f(i,j,k)= i+10d0*j+k 
     WRITE(ofile,'(A,F4.2,A,F4.2,A)')'file',i*1d0,'_',j*1d0,'.dat' 
     if (k.eq.1) then 
     OPEN(61,file=ofile,action='write',status='replace') 
     else 
     OPEN(61,file=ofile,action='write',position='append') 
     end if 
     WRITE(61,*)k,f(i,j,k) 
     CLOSE(61) 
    enddo 
    enddo 
    enddo 
    stop 
    end 

如果你想堅持的只是刪除文件的想法中的每個運行剛開始的循環前添加call system('rm file*')之前(這是一個Unix終端)。

+0

謝謝。這不是我想要的。可能是我沒有清楚地說出問題。我想打開do循環內的文件。 就mathematica而言,我可以很容易地告訴問題。 1. OUTPUT1 >> file.txt的 OUTPUT2 >>> file.txt的 VS 2. OUTPUT1 >>> file.txt的 OUTPUT2 >>> file.txt的 這兩者之間的區別是在病例 - 1每次運行它都會在file.txt中新增,而在case-2中則會附加在舊文件中。也許我應該開始一張明確提及的新票。 注意:fortran中的一個簡單的方法是在我運行之前每次刪除file.txt。 –

+0

但是,爲什麼你需要完全打開循環內的文件? –

+0

我在裏面打開,因爲我的文件名是用do循環語法格式化的。這是一個完整的代碼。如果你跑兩次,你會知道這個問題。 '程序測試 雙精度˚F 尺寸f(10,10,10) 整數i,J,K 字符* 500 OFILE 不要K = 1,10 做= 1,2 做J = 1, '(',(A,F4.2,A,F4.2,A)')'文件',i * 1d0,' (61,*)k,f(i,j,k) ('61,file = ofile,action ='write',position ='append') WRITE enddo enddo enddo CLOSE(61) stop end' –