2016-06-10 20 views
2

單位在AIX上運行的Fortran 90。試圖編譯和運行此代碼,我得到一個錯誤,說:的Fortran錯誤:連接到格式的文件

The unformatted I/O statement on unit 200 cannot be completed because the unit is connected to the formatted file /filepath/TB_20160610023926_bufr_v620.dat. 
The program will recover by ignoring the I/O statement. 

我不完全確定這個錯誤的含義。我只打開一次文件,單元號碼沒有連接到任何其他文件。

INTEGER,PARAMETER :: GRID_TB_UNIT = 200 
tbhmap=0 

CALL SYSTEM('mkdir -p ' // TRIM(data_path) // '/' // & 
         TRIM(TB_PREFIX) // '/' // & 
         date_str) 

OPEN(UNIT = GRID_TB_UNIT,    & 
    file = TRIM(TB_binary_filename), & 
    STATUS = 'REPLACE',     &  
    ACCESS = 'SEQUENTIAL',    & 
    FORM = 'FORMATTED')       

nrecg = 0 
DO rr=1,720 
DO cc=1,1440 

    IF(countgrid(cc,rr) < 1)CYCLE 

    nrecg = nrecg+1 

    tbhmap(cc,rr) = tbhgrid(cc,rr)/countgrid(cc,rr) 
    timemap(cc,rr) = timegrid(cc,rr)/countgrid(cc,rr) 

    GRID_TB_record%row = rr 
    GRID_TB_record%col = cc 
    GRID_TB_record%year = yeargrid(cc,rr) 
    GRID_TB_record%month = monthgrid(cc,rr) 
    GRID_TB_record%time = timemap(cc,rr) 
    GRID_TB_record%tbh425 = tbhmap(cc,rr) 

    WRITE(GRID_TB_UNIT,REC=nrecg)GRID_TB_record 

END DO 
END DO 

CLOSE(GRID_TB_UNIT) 
+0

@HighPerformanceMark這導致了另一個錯誤:'的REC =說明符不能出現在一個列表或名稱列表數據傳輸statement.' – kkd92

回答

3

在Fortran的一個文件的連接的形式可以是「FORMATTED」(意思是人類可讀的)或「未格式化的」(未人類可讀)。的一些輸入/輸出語句的語法允許不同,取決於文件 - 例如格式化的輸入/輸出語句將總是具有某種形式的格式說明,UNFORMATTED輸入/輸出語句必須不會有這樣的說明符。

您已經打開了與FORMATTED文件的連接,但是有問題的WRITE語句沒有必要的格式說明符 - 即WRITE語句的語法是UNFORMATTED連接的語法。沒有格式說明符,編譯器不知道如何以可讀形式呈現WRITE語句的輸出列表中的項目值。

如果您希望將文件格式化爲人類可讀的格式,請將相應的格式說明符添加到WRITE語句中(格式說明符*,如註釋中所建議的那樣,指定取決於處理器的格式基於輸出列表中的參數被使用)。如果您不希望該文件是人類可讀的,則將OPEN語句中的FORM更改爲UNFORMATTED。

~~~

類似於一個連接的形式,並且所述輸入/輸出語句的語法之間的不一致之處,也有在連接和語句的ACCESS之間的不一致性。的訪問是指記錄的性質在文件中(以及這些記錄,然後「訪問」):「連續」 - 該文件包含了可以在序列被訪問不同長度的記錄,「直接」 - 該文件包含固定長度可以以任意順序訪問記錄,以及「STREAM」 - 該文件原則上可以被視爲文件存儲單元流(又名字節)(格式的流文件可以有太多基於流的換行符記錄結構) 。

在該示例中,用於連接到所述文件的訪問被明確提名爲連續的。但是,WR說明語句中的REC說明符(「將信息寫入此特定記錄」)的外觀與DIRECT ACCESS連接一致。不符合標準的程序不允許這種不匹配。

+0

這真的幫助澄清。你能解釋一下ACCESS的含義嗎?我知道將它指定爲「直接」需要定義一個記錄長度,但是由於記錄已到達,I/O語句沒有完成,所以我遇到了錯誤。 – kkd92

+0

對於連接和聲明中的說明符,我也忽略了ACCESS的不一致。更多要遵循。 – IanH