よくapacheやpostfix、smbなどにconfの設定ファイルがあるのですが、
その中身は
xxx = /abc/efg
のようにxxx変数と内容ってかんじで使われてますが、
こういった仕組みを作るには、apacheやpostfixなどの
ソフトはどのようにして行っているのでしょうか?
明確にわかる方がいらっしゃいましたら宜しくお願いします。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/jap...
MSDN ライブラリ サイト移行に関する重要なお知らせ
ファイルを行単位で読んで、= で区切って一文字づつ解釈。たいていその種のことをやってます。
いちおう、
char conf[256], str[256];
FILE fp = fopen(”conf”, ”r”);
if (fp!=NULL)
{
fscanf(fp, ”%s = %s¥n”, conf, str);
fclose(fp);
}
こんな感じで conf に ”xxx” が、str に ”/abc/efg” が得られますが、このままだと = の前後に空白がないとダメだとか、改行がないとダメだとか、まったく違うパターンのファイルだと誤動作する可能性があるとか、色々問題あるので(つまりエラー処理が出来ない)まともなソフトは fscanf はほとんど使いません。
なお、Windows に限ってよければ GetPrivateProfileString() と言うAPIがありますので、
GetPrivateProfileString(””, ”xxx”, ””, str, sizeof str-1, ”conf”);
これで、str に ”/abc/efg” が得られます。
なお、最初の引数はセクション名で [ ] 内に指定した文字列で指定した行で区切られた部分だけを検索対象としますので apache 等はこれは使ってないはずです。
うーん、結構泥臭くやってますよ。(^^;
やはりここは一通りソースをご覧になることをお勧めします。
sambaの場合、source/param/params.c で処理していますので、Parse()関数あたりを起点に読み進めていくとよろしいかと。
泥臭いんですか〜!
ライブラリかなにかを誰かが作っていて
便利なものがあったらな〜とは思ってみたのですが・・。
ありがとうございます。
トークンに分割すればよいのでは?
strtok関数を使います。
たとえば、.iniファイルを一行読み込みで読み込んでいくとします。
で、トークン分割の字句に、[=]としておき、
一番目に得られたものを、変数名、二番目に得られたものをその値。とすればよいと思います。
ここで、[ ](スペースをどうするかですが、スペースを認めるiniファイルもあれば、スペースを認めないiniファイルがあります。)
もしも、スペースを認めるのでしたら、
http://www.hidecnet.ne.jp/~sinzan/tips/c/c_tip0e.htm
部分文字列を置換する−C/C++−水無瀬の部屋
こんな作業で、空白を削除する作業が必要になってきます。
また、もし[#などの]コメント行として扱いたい場合は、
トークンの分割字句に、[#]を入れておき、空白除去後の一番目のトークンが、#が含まれていたら無視しなさい。
などの対応が必要になります。
http://phpspot.net/php/pgini%83t%83@%83C%83%8B%82%F0%89%F0%90%CD...
iniファイルを解析する - phpspot
phpならこんな関数が用意されていますし、
Visual C++ならば、iniファイルの編集用の関数が用意されています。
ん〜phpは便利そうでいいですね〜!
そもそもCやC++で変数にする方法がわからない・・。
連想配列になんとか置き換えるんでしょうか???
とりあえずソースを読めみたいな雰囲気ですので
頑張ってそうします!
ありがとうございました。
ありがとうございます。