2016-07-23 29 views
0

我正在編寫我的代碼並在Fortran中使用輸入和輸出功能。代碼如下所示(只是爲了簡化):爲什麼在Fortran中使用命令PRINT覆蓋輸入文件?

PROGRAM TEST 

    REAL, DIMENSION(1000):: A 
    REAL:: B 
    INTEGER::T 

!Defining input and output 
    OPEN(UNIT=1, FILE='input.dat', STATUS='OLD') 
    OPEN(UNIT=2, FILE='output.dat', STATUS='NEW') 

!Reading from file "input.dat" 
    READ(1,*) (A(I),I=1,1000) 

!Just for initial condition 
    B=0.0 

    DO T=1, 10 
    PRINT *, 'Step =', T 
     DO I=1, 1000  
      B=B+1.0  
      A(I)=A(I)/B 
     END DO 
    END DO 

!Writing results into file "output.dat" 
    DO I=1, 1000 
     WRITE (2,100) I, A(I) 
    END DO 
    100 FORMAT (' ',T3, I12, T17, F14.4) 

END PROGRAM TEST 

我用Gfortran 5.3,結果並不像我所期待的。我希望在程序運行時屏幕上(或Ubuntu操作系統中的終端)獲得變量T的結果,並將變量IA(I)寫入文件output.dat。我對變量IA(I)沒有問題,因爲它們已成功寫入文件output.dat。問題出在變量T,它沒有出現在終端上,但它被寫入文件input.dat。那麼,即使文件input.dat中的前一個文件也沒有被覆蓋。任何人都可以給我這個建議嗎?

僅供參考,我也嘗試過其他的編譯器(使用Windows操作系統),例如:

  1. 微軟Fortran的(很舊的),但它的工作就像我的預期。
  2. MinGW-w64(適用於Windows的GCC版本):但它沒有正常工作。
+0

Mhm,Linux上的GCC 5.3按預期工作。 –

+0

@AlexanderVogt:您是否也嘗試過Gfortran 5.3,並獲得了與我相同的結果?我認爲我上面寫的代碼沒有錯,不是嗎? –

+1

該代碼適合我。乍一看 - 我沒有看到問題。雖然我個人不會選擇自己的單位(提示:'newunit ='),特別是不要低於10。這可能會干擾STDIN/STDERR/STDOUT。 –

回答

5

這可能是因爲在平臺/編譯器/編譯器版本/編譯器選項的組合中,單元1是控制檯的預連接單元。

您的OPEN語句將該單元指向您的輸入文件。因此,隱式地指向該單元的PRINT語句將其輸出指向相同的文件。

使用不同的單元編號 - 選擇大於10的值通常對於編譯器預連接的單元是安全的。爲了進一步提高安全性,您可以使用INQUIRE(UNIT=unit_number, EXIST=some_logical_variable)語句來檢查特定單元是否在OPEN語句之前連接到文件 - 如果有,請選擇其他單元編號。理想情況下,如果您正在寫入Fortran 2008,則可以使用NEWUNIT說明符。 (不要將單元數值硬編碼到輸入/輸出語句中 - 它們應該總是用變量或命名常量表示,以便可以在一個地方輕鬆設置/更改該值。 )

1

我找到了答案。其實我上面發佈的代碼在Gfortran 5.3上運行良好,因爲我使用了OPEN(UNIT=1,...)OPEN(UNIT=2,...),這是因爲我使用的是12,所以沒有問題。我只是寫了這個簡單的例子來代表我的真實代碼,而沒有先檢查它。但實際上,在我真正的代碼,我用了兩個聲明,OPEN(UNIT=5,...)OPEN(UNIT=6,...)存在的,這是不是在允許的Fortran,因爲:

  1. UNIT=5聲明Standard In它用於從鍵盤讀取數據。
  2. UNIT=6聲明Standard Out這是用來打印一般輸出到屏幕。
  3. UNIT=0聲明Standard Error這是用來打印錯誤信息到屏幕。

我之前沒有意識到,因爲我正在研究相當老的代碼,所以需要將其重寫爲更新的版本。所以,爲了避免這些問題,請不要使用UNIT=5,UNIT=6UNIT=0

+1

使用更高的數字5,6和0不是標準的,其他小數字也可以預先連接,不要使用低於10的任何數字。 –

+0

@VladimirF:就我而言,我只是隻需將OPEN(UNIT = 25,...)和OPEN(UNIT = 26,)更改爲OPEN(UNIT = 5,...)和OPEN(UNIT = 6,...)。 ..)'並且它可以正常工作,但是,對於安全來說是絕對正確的,最好使用大於'10'的值。 –

相關問題