0

1 行あたり 80 文字のファイルがあります。「ATOM」で始まる特定の行に行きたいです。

fscanf(f1," %s%*[^\n]", rec)と比較recしてみましstrcmp(rec,"ATOM")たが、一致から次の行を読み取ります。
も試しましfscanf("line_format", variables)たが、これはファイルから別の場所を読み取ります。

ラインは

ATOM      1  N   MET A   1      36.643 -24.862   8.890  1.00 24.11             N 

これから、文字ごとに読み取り、変数に割り当てたいと思います。float値とスペースに問題があります。特定の変数の場所にスペースが見つかった場合、どうすればそれを読むことができますか? float値の間にスペースがない場合、どのように値を読み取るのですか?

4

2 に答える 2

1

を使用して入力ファイルから各行を読み取り、またはfgets()を使用してトークン化し、最初のトークンを「ATOM」と比較してから、またはを使用して残りのトークンを解析し、必要に応じて浮動小数点または整数に変換できます。strtok()strtok_r()atof()atoi()

ATOMPDBファイルのレコードは固定サイズのフィールドで明確に定義された構造を持っており、準拠したpdbファイルは解析がはるかに簡単であるため、これは少しやり過ぎです。atof()関連する部分文字列を選択して、またはに渡すだけatoi()です。

于 2012-06-19T08:42:47.490 に答える
0

(not shown) にエラーがあったと思いますline_format。あなたは本当にできるはずです:

if( fscanf(f1, "ATOM %d %s %s %s %d %f %f %f %f %f %s", /* ... */) == 11 )
{
  /* store/analyze/print the parsed values */
}

もちろん、これにより文字列引数が上書きされる危険性があることに注意してください。より具体的なフォーマット文字列を使用して長さを制限できます。

于 2012-06-19T08:54:44.350 に答える