2017-08-23 23 views
-1

fmt形式の変数ファイルから特定のデータを読み込もうとしています。必要なデータは、この場合はa,bおよびcの値とfft coefficients (width,height,depth)(25,300,300)の値です。テキストファイル(C)から特定のデータを読み込む

の例では、変数を割り当てるには、このファイルから次のようになります。 a = 2.467 b = 30.000 c = 30.000 width = 25 height = 300 depth = 300。 ただし、これらの値は入力ファイルが変更されると変更されます。

現在のところ、これらを読むために私が考えることができる唯一の方法は、テキストファイル内の位置からです。私はこれが好きではありませんが、レイアウトでテキストファイルが少し変わった場合にバグが発生しやすくなります。誰かが別の方法を提案することができますか(CでPython reモジュールに似たものがありますか?)

以下の例のテキストファイルを参照してください。

BEGIN header 

     Real Lattice(A)    Lattice parameters(A) Cell Angles 
    2.4675850 0.0000000 0.0000000  a = 2.467585 alpha = 90.000000 
    0.0000000 30.0000000 0.0000000  b = 30.000000 beta = 90.000000 
    0.0000000 0.0000000 30.0000000  c = 30.000000 gamma = 90.000000 

1       ! nspins 
25 300 300    ! fine FFT grid along <a,b,c> 
END header: data is "<a b c> pot" in units of Hartrees 
+1

"テキストファイルのレイアウトが少し変わった場合にバグを起こしやすい" - 一定のファイルフォーマットに頼ることができない場合、誰でもパーサー、つまりPythonパッケージ開発者を書くのは難しいです。 PythonでできることはすべてC言語で行うこともできます。 –

+0

ファイルを 'a'、' b'と 'c'で読むのであれば、' a = value'のように書かれているので、ファイル。しかし、「fft係数」は単純ではありませんが、それらの位置が常に同じであれば(例えば、常に細かいFFT [...] 'その行で)これも簡単です。 –

+0

fmt形式の関連する仕様へのリンクを少なくとも与えてください。私はそれについて聞いたことがありません。 –

答えて

1

あなたが最初を指定して、入力の実際file formatを正式必要があります(単一の例では十分ではありません)。あなたは、少なくとも文書化目的のために、何かEBNF記法を使用するかもしれません(私は推測することができますが、BEGINLatticeは重要ですが、fmt wikipageはそれらに言及していません)。

例は間違ったアプローチである。このファイル

からだろう。あなたのプログラムで扱えるようになる一般ファイル形式を知る必要があります。これはソフトウェア設計の一部です。だからまずそれを指定してください。

次に、普通のparsingの技術を使用します。 lexical analysisについても読んでください。おそらく、GNU bisonのようなparser generatorが役に立つかもしれませんし、おそらく単純なrecursive descent parserで十分かもしれません。あなたの入力フォーマットが行を気にしているとしたら、それを1つずつ(例えば、POSIX​​で)読み込み、それぞれを解析することができます。

Dragon Bookを読むことは価値があります。

POSIXは<regex.h>を持っているCでのPythonのreモジュールのようなものがあります。 regcomp(3)を参照してください。 pcre2もご覧ください。私はそれがここで重要であるとは確信していません。

+1

私の意見では、バイソンパーサーとレキシカル分析の勉強は、この単純な質問に対してはあまりにも残酷すぎますね。 –

+0

私はファイル形式がわからないので、私は答えることができません。 –

+0

fmtファイル –

関連する問題