Tetra や Keypoints のプログラムには初期設定ファイルからの読み込みにおいて問題があります。
恥ずかしながら現状のコードをさらします^^;
| while (EOF != fscanf(fp, "%s %s", &name, &val)) {
| if (name[0] == '#') continue;
| if (0 == strcmp(name, "VLEN")) {
| vlen = abs(atol(val));
| }
| :
| :
| }
自分が使うだけだと思って楽して書いているわけです。
fscanf は fp(ストリーム) から2つの要素を読み込んできますが、空白、改行なども区切り文字として認識しますので、例えば先頭1文字目が"#"であったとしても要素が3つあると、2回目の読み込みで3つ目から読み始め、次の行の先頭要素を2要素目としてずれていってしまいます。
よりよく書くなら
fgets を使って1行全体(⇒line)を読み込み
読み込んだ行(line⇒)から sscanf で要素分解
するべきです。
現状のままだと
# これはコメントとしてOK.Para=0
VLEN 3056
#これもOKコメント ABC
VLEN 3056
# これはNG 345
VLEN 3056
最後のパターンのときは、name=345,val=VLEN になってしまうのでパラメータVLENが指定されていないことになり、デフォルト値が使われてしまいます。
そのうち修正しますのでメモとして記事を書いておきます。
恥ずかしながら現状のコードをさらします^^;
| while (EOF != fscanf(fp, "%s %s", &name, &val)) {
| if (name[0] == '#') continue;
| if (0 == strcmp(name, "VLEN")) {
| vlen = abs(atol(val));
| }
| :
| :
| }
自分が使うだけだと思って楽して書いているわけです。
fscanf は fp(ストリーム) から2つの要素を読み込んできますが、空白、改行なども区切り文字として認識しますので、例えば先頭1文字目が"#"であったとしても要素が3つあると、2回目の読み込みで3つ目から読み始め、次の行の先頭要素を2要素目としてずれていってしまいます。
よりよく書くなら
fgets を使って1行全体(⇒line)を読み込み
読み込んだ行(line⇒)から sscanf で要素分解
するべきです。
現状のままだと
# これはコメントとしてOK.Para=0
VLEN 3056
#これもOKコメント ABC
VLEN 3056
# これはNG 345
VLEN 3056
最後のパターンのときは、name=345,val=VLEN になってしまうのでパラメータVLENが指定されていないことになり、デフォルト値が使われてしまいます。
そのうち修正しますのでメモとして記事を書いておきます。