2017-08-11 14 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

ACCESS="direct"が指定されているため、デフォルトはフォーマットされていないため、シーケンシャルアクセスのために接続されたときにフォーマットされたデフォルトと比較されます。

あなたがフォーマットされたアクセスのために積極的に開く必要があり、書き込みのためのフォーマットを提供ファイル「読める」ようにするには:

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

すべての良いFortranプログラムは、ラインimplicit noneが含ま

PROGRAM test 

    IMPLICIT NONE 

この

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 

...解説...試してみてください。その理由は101 Qsで説明されています。スタックオーバーフローについてはここで説明しますが、ここでは繰り返しません。

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

最新のFortran規格では、コンパイラは、文字のこれら2つのkind Sを提供する必要があります。私は正直なところ、iso_10646がUTF-8と同じかどうかは分かりませんが、もしそうでなければあなたはおそらく運が悪いでしょう。ここでは、プログラムの後半で使用する文字種を識別するための2つのパラメータを定義します。あなたの目的のために、これらのパラメータの最初のものは不要ですが、それについても知っておくべきです。

あなたのコンパイラが他の文字種をサポートしていると思われる場合は、ドキュメントをお読みください。

(脇:。技術的には、3番目の文字種類名、defaultこれは、最も可能性の高い旧asciiiso_10646のいずれかに、文字の種類を設定する可能性があるがあるが、これはあなたにとって重要であるならば、あなたのコンパイラのマニュアルを参照してください。私は、テキストhelloと種類ucs4の持つ文字変数を定義したこれらの行の第二で)

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

(あなたが上記を参照として、iso_10646のローカルコードです、)。接頭辞ucs4_がない場合、文字列hellodefaultの種類として解釈され、変数greetingに格納されるとucs4に変換されます。この場合、asciiとの文字の(表示)の間に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回書き込みます。あなたは未フォーマット入力/出力用のファイルを開いているあなたのopen声明で

END PROGRAM test 
+0

GRAVARTXT.f90(8):エラー#6684:これは、このコンテキストで種別型パラメータの値が正しくありません。 [UCS4] キャラクタ(len = 5、kind = ucs4):: greeting = ucs4_ "hello" -----------------------^ GRAVARTXT。 f90(8):エラー#6684:これは、このコンテキストで種別型パラメータの値が正しくありません。 CHARACTER(len = 5、kind = ucs4):: greeting = ucs4_ "hello" ------------------------------ -------------^ GRAVARTXT.f90(code 1) ' – Dadep

+0

のためにコンパイルが中止されましたが、ASCIIでしかありません... – Dadep

+1

@Dadep、おそらくあなたのコンパイラが、この種の文字をサポートします。 'print *、selected_char_kind( 'ISO_10646'); end'という値を見ると、' -1'と表示されるでしょう。 – francescalus

関連する問題