2011-06-24 18 views
6

私はFortran初心者です。私は、テキストファイルを読んでその内容を個々の変数に保存したいと思っています。私は非常に有用なFortranチュートリアル(http://www.math.hawaii.edu/~hile/fortran/fort7.htm#read)を見つけました。ここに挙げられている例の1つに従おうとしています。私は私の現在のディレクトリにこのテキストファイルを保存したFortranでカンマ区切りのテキストファイルを行単位で読む

1.23, 4.56, 7.89 
11, 13, "Sally" 

:具体的には、私はと呼ばれるテキストファイル次のテキストdata.txtをを作りました。私は、少なくともアップ機能が含まれて考えるGNU Fortranコンパイラーを使用しています

PROGRAM test 
    IMPLICIT NONE 

    REAL :: x, y, z 
    INTEGER :: m, n 
    CHARACTER first*20 

    OPEN(UNIT = 7, FILE = "data.txt") 
    READ(7,*) x, y, z 
    READ(7,*) m, n, first 

    PRINT *, x 
    PRINT *, y 
    PRINT *, z 
    PRINT *, m 
    PRINT *, n 
    PRINT *, first 
END PROGRAM test 

:その後、私は、次のコードを含むファイルtest.f90を(も私の現在のディレクトリにそれを保存する)を作成していますFortran95を含む。上記のコードは、少なくともデフォルト設定では大丈夫です。 Iが得られた実行可能ファイルを実行する場合には、私はこのエラーメッセージを取得:

At line 10 of file test.f90 (unit = 7, file = 'data.txt') 
Fortran runtime error: End of file 

ライン10はラインREAD(7、*)M、N、最初です。上記のコードで私が間違っていることを見てもらえますか?

+0

別のユニット番号(> 10)で試してください。おそらく、あなたのコンパイラは、事前に接続されたデバイスにユニット7を使用しています。 – eriktous

+0

@eriktous:ありがとうございます。残念ながら、これは問題を解決しません(少なくとも私が15の単位を使用する場合は)。しかし、アドバイスをありがとうございます。あらかじめ接続されたデバイスのために10以下の単位がコンパイラによって使用されるかもしれないことを知ることは本当に良いことです。私はこれを念頭に置いておきます。ありがとう! – Andrew

答えて

2

正確なエラーメッセージと正しい出力の両方を再現できます。私はWindows上でgfortranを使い、メモ帳を使ってデータファイルを作成しています。
行末の文字で2番目のデータ行を終了する場合(Enterキーを押す)、プログラムは正しい出力を表示します。終了しないと、実行中にエラーが表示されます。

基本的に、ランタイムは行を読み込もうとしますが、行の終わりに達する前にファイルの終わり文字を検出します。

3

サンプルプログラムをサンプルデータとともに使用すると、効果がありました。おめでとう!出力されました:

1.2300000  
    4.5599999  
    7.8899999  
      11 
      13 
Sally 

時々Fortranの実行可能ファイルが終末を回線に敏感であることができ、あなたのために働いてOSの正しいラインターミネータを要求し、最後の行に含めていない可能性が理由を推測するにはデータファイル。逆に、多くのエディタは静かに改行を変換します。私は、一般にMicrosoftプログラムによって書かれたファイルでこの問題にぶつかります。

+0

私は本当にもともと私のテキストファイルをMicrosoftのエディタ:Windows XPのメモ帳で作った。今は同じテキストを含む新しいテキストファイルを作成しましたが、今回はXEmacsを使用し、7または15の代わりに16の単位値を使用して書いています。残念ながら、まだ実行されません。ただ好奇心から、どのテキストエディタをお勧めしますか?また、おそらく、いくつかのFortran方言に「ターミネーター文字」があるかもしれませんか?例えば、Cでは、各テキストファイルは "\ 0"またはヌルポインタで終わらなければならないと私は思います。 – Andrew

+0

XEmacsには特有のものがあります。代わりにviを使ってテキストファイルを作成すると、それはうまく動作し、まったく同じ出力が得られます。私はGNU Fortranコンパイラ(gfortran)を使用しています。あなたもそれを使っていますか? – Andrew

+1

私はMac OS Xでgfortranを使用しています。エディタにかかわらず、実行ファイルは最後の行を含め、行末にOSの行終端文字が必要です。 @eriktousが書いたように、必ずEnterを使用して行終端文字を取得してください。マイクロソフトのプログラムは間違ったターミネータを頻繁に使用するため、明らかではない問題が発生します。 –

2

一部のコンパイラでは、データの最後の行の後に新しい行を追加することが重要です。例えば、gfortranはそれを必要とするコンパイラであり、かなり論理的です。 Sun(Oracle)コンパイラはそれを必要としません。

+0

これは基本的に私が言ったものと同じではありませんか? – eriktous

+0

はい、そうです。私はすぐに読んだ後にそれを認識しませんでした。私は主に、異なる編集者についての間違った議論を読んでいます。 –

関連する問題