2017-08-11 68 views
0

我試圖從fortran中寫入一個文本文件。寫格式化的UTF-8文本文件fortran

我這樣做短的測試程序,但當然這是行不通的,因爲它不會產生可能是可讀的文本文件:我看了很多不同的事情

PROGRAM teste 

INTEGER(4) REC2,RECL1 
character(20) :: charI, wanted 
RECL1=10 
DO REC2=1,10 
    OPEN(1,FILE='teste.txt',ACCESS="direct",RECL=RECL1); 
    write (charI, "(A5,I4)") "hello", REC2 
    wanted=trim(charI) 
    write(1,REC=REC2) wanted 
    close(1) 
END DO 


END PROGRAM teste 

,但它仍然是真的不清楚如何它應該被寫入。

在寫入之前是否需要轉換爲字符串?如果是,爲什麼?

+2

什麼用youbmean「它不工作」?避免使用這個短語,它沒有用處,也不會告訴任何事情。請明確點! –

+0

是的,對不起,你是對的。我的意思是它創建一個文件,但它不會創建一個可讀的文件,格式可以通過例如gedit打開。 – Dadep

回答

1

在你open聲明要爲格式化輸入/輸出打開一個文件。由於您已指定ACCESS="direct",所以默認情況下爲未格式化,而默認情況下爲連續訪問時爲格式化的默認值。

要使文件「可讀」,你需要積極開放的格式化了的訪問,併爲寫作提供格式:

open(1,FILE='teste.txt',ACCESS="direct",RECL=RECL1, FORM='formatted') 
... 
write(1,fmt=...,REC=REC2) ... 
2

試試這個

PROGRAM test 

    IMPLICIT NONE 

    INTEGER, PARAMETER :: ascii = selected_char_KIND ("ascii") 
    INTEGER, PARAMETER :: ucs4 = selected_char_KIND ('ISO_10646') 
    INTEGER :: ix 
    CHARACTER(len=5,kind=ucs4) :: greeting = ucs4_"hello" 

    OPEN(10,FILE='test.txt')  
    DO ix=1,10 
    WRITE (10,'(A5,I4)') greeting, ix 
    END DO 
    CLOSE(10) 

END PROGRAM test 

...的評論...

PROGRAM test 

    IMPLICIT NONE 

所有優秀的Fortran程序包括線implicit none;其原因在101 Q和As Stack Overflow中解釋,我在這裏不再重複。

INTEGER, PARAMETER :: ascii = selected_char_KIND ("ascii") 
    INTEGER, PARAMETER :: ucs4 = selected_char_KIND ('ISO_10646') 

最新的Fortran標準要​​求編譯器提供了字符的這兩個kind秒。老實說,我不確定iso_10646是否與UTF-8相同,但如果不是這樣的話,你可能會失敗。在這裏,我定義了兩個參數,用於識別稍後在程序中使用的字符種類。爲了您的目的,這些參數中的第一個是不必要的,但您也應該瞭解它。

我想你的編譯器可能支持其他字符類型,閱讀文檔。 (另外:在技術上,有第三個字符種類名稱,default。這很可能將字符種類設置爲asciiiso_10646,很可能是前者,但是如果這對您檢查編譯器的文檔很重要。 )

INTEGER :: ix 
    CHARACTER(len=5,kind=ucs4) :: greeting = ucs4_"hello" 

在我定義一個字符變量與文本hello這些線的第二和的種類ucs4(其中,因爲你見上文,是一個本地代碼iso_10646)。沒有前綴ucs4_,字符串hello將被解釋爲種類default,然後在存儲到變量greeting中時轉換爲ucs4。在這種情況下,在asciiucs4中的字符(的表示)之間存在1:1映射的情況下,該前綴是嚴格不必要的,但是在其他情況下不會有這種情況。

OPEN(10,FILE='test.txt')  
    DO ix=1,10 
    WRITE (10,'(A5,I4)') greeting, ix 
    END DO 
    CLOSE(10) 

我已經刪除了關於直接訪問和寫入文件中特定記錄的所有guff。這似乎是你的迫切需要,這一切都是沒有必要的。所以這個循環會將greeting(即ucs4字符串hello)和一個行索引寫入文件test.txt 10次。

END PROGRAM test 
+0

我理解得好多了,非常感謝,但是,我仍然有以下錯誤消息:'GRAVARTXT.f90(8):錯誤#6684:在此上下文中,這是一種類型參數的錯誤值。 [UCS4] CHARACTER(len = 5,kind = ucs4):: greeting = ucs4_「hello」 -----------------------^ GRAVARTXT。 f90(8):錯誤#6684:在此上下文中,這是一種類型參數的錯誤值。 CHARACTER(len = 5,kind = ucs4):: greeting = ucs4_「hello」 ------------------------------ -------------^ 編譯中止GRAVARTXT.f90(代碼1)' – Dadep

+0

它的工作,但只與ascii ... – Dadep

+1

@Dadep,這可能只是意味着你的編譯器doesn' t支持這種性格。如果你打印*,selected_char_kind('ISO_10646');結束'你可能會看到'-1'的值。 – francescalus