2012-02-06 6 views
2

Fortranで各行の浮動小数点数が不定であるファイルを読み込んでいます(現在は行に約17個の値があります)。私は与えられた浮動小数点変数に各行の 'n番目の値を読みたいと思います。私はこれをどうやってやるべきですか? CではFortranでの文字列の解析

私はそれが文字列の上に全体のラインを読み、以下のような何かをすることでした書いた方法:

for(int il = 0; il < l; il++) 
{ 
    for(int im = -il; im <= il; im++) 
     pch = strtok(NULL, "\t "); 
} 
for(int im = -l; im <= m; im++) 
    pch = strtok(NULL, "\t "); 
dval = atof(pch); 

ここで私は継続的に短縮するため、(値を読み取り、それを捨てるいます私が読もうとしている価値を受け入れる準備が整うまで。

私はこれをFortranで実行できますか? Fortranでこれを行うより良い方法はありますか?私のFortranコードの問題点は、read(tline, '(f10.15)') tline1はtlineを短縮しないことです(tlineは行全体を保持する文字列であり、tline1はそれを解析しようとしています)ので、私のCルーチンで行ったのと同じメソッドを使うことができません。

助けが必要ですか?

+0

確かにこれはいくつかのライブラリが必要ですか?ホイールを再発明する必要はありません。 – DNA

答えて

2

問題は、FortranがレコードベースのI/Oシステムであり、Cがストリームベースであることです。

Fortran 2003に準拠したコンパイラ(現バージョンのgfortranが動作するはずです)にアクセスできる場合は、streamACCESS指定子を使用して、必要な処理を実行できます。

例はhereです。

もちろん、あなたが本当に傾けているのであれば、FortranからC関数を直接使うことができます。 2つの言語のインターフェースは一般的に単純です。通常、小文字の名前とアンダースコア(コンパイラとプラットフォームに依存します)を持つラッパーのみが必要です。配列や文字列を前後に渡すことは一般的ではありません。この例では必要ないでしょう。

データが文字配列に入ったら、ADVANCE=noシグニチャを使用しているように、別の変数にデータを読み込むことができます。

do i = 1, numberIWant 
    read(tline, '(F10.15)', ADVANCE="no") tline1 
end do 

ここで、tlineは、ループの最後に番号を含める必要があります。

レコードベースのI/Oのため、READステートメントは、通常、レコードの最後の後にあるものをスローします。しかし、ADVANCE=noはそれを知らない。

+0

ストリームアクセスでファイルを開くことができますが、これらの値を文字列から読み取ろうとしています。文字列をストリームとして扱う方法はありますか? – drjrm3

+0

あなたはあなたがファイルから読み込んでいることを投稿しました - データはファイルから文字列にどのように送られますか?ファイルから必要なものだけを読み取ることはできませんか、特定の時間に全体と部分のみが必要ですか? – tpg2114

+0

文字列からの読み取りのための拡張された答え。 – tpg2114

0

正確な位置がわかる場合は、T編集記述子を使用して、その位置から次の読み取りを開始できます。
たとえば、各フィールドの幅が10文字で、5番目の値を読み取るとします。 read文は、次のようになります。あなたが動的フォーマットとして文字変数を使用することにより、t後に正しい番号で、実行時にフォーマット文字列を作成し、この数に入れるために内部ファイルの書き込みを使用することができます。:

read(file_unit, '(t41, f10.5)') value1 

P.s。
位置で始まる値が必要な場合を考えてみましょう。それで、次のようになります(一文字と二重引用符を入れ替えて、各文字列の開始位置と終了位置を明確にします)。