「ブロック機能」のリニューアルについて

表題の実現方法について、どうしてもわからなかったので、質問を挙げさせていただきます。

会社から、INIファイルの内容を読み込んで、初期値設定に利用するように指示があり、実現方法がわからず、非常に困っています。
ライブラリを購入せずに、対応したいです。
どなたか、本内容にお詳しい方、ご教授下さい。

◆開発環境
言語:C
OS:Linux(Ubuntu 9.10)
IDE:eclipse
コンパイラ:gcc 4.4

◆質問
1.セクションで区切られたIniファイルを読み込み、読み込んだデータを各種変数に格納したい。
《想定Iniファイル》
Test.ini
[NETWORK]
IPADDR=192.***.***.***.*** → char *IPADDRに格納したい
PORT=****            → long PORTに格納したい
[PRM1]
Anum=***             → char *Anumに格納したい
Bnum=***             → char *Bnumに格納したい
Cnum=***             → char *Cnumに格納したい

[PRM2]
TIME1=****
TIME2=****

2.上記1の処理を関数とし、main関数からコールして、mainプログラムの起動時にINIファイル内容を読み込みたい。

教えて!goo グレード

A 回答 (5件)

Iniファイルのフォーマットが固定されているものとして…:


(エラー処理は省いています。)
(コンパイル確認はしていません:C標準関数を使っています。)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LINELEN 256

typedef struct {
//[NETWORK]
char *IPADDR;
long PORT;
//[PRM1]
char *Anum;
char *Bnum;
char *Cnum;
//[PRM2]
// ........
} t_Ini;

int ReadIni(char *fname, t_Ini *IniData);
int ReadIni(char *fname, t_Ini *IniData)
{
FILE *fp;
char line[LINELEN];
char stemp[LINELEN];

if((fp = fopen(fp, "rt")) == NULL)
return 0;

while(fgets(fp, LINELEN, line) != NULL){
line[strlen(line)] = '\0';
if(strstr(line, "[NETWORK]") == line){
fgets(fp, LINELEN, line);
line[strlen(line)] = '\0';
strcpy(IniData->IPADDR, line + strlen("IPADDR="));
fgets(fp, LINELEN, line);
line[strlen(line)] = '\0';
IniData->PORT = strtol(line, NULL, 0);
fgets(fp, LINELEN, line);
line[strlen(line)] = '\0';
strcpy(IniData->Anum, line + strlen("Anum="));
}

if(strstr(line, "[PRM1]") == line){
fgets(fp, LINELEN, line);
line[strlen(line)] = '\0';
strcpy(IniData->Anum, line + strlen("Anum="));
fgets(fp, LINELEN, line);
line[strlen(line)] = '\0';
strcpy(IniData->Bnum, line + strlen("Bnum="));
fgets(fp, LINELEN, line);
line[strlen(line)] = '\0';
strcpy(IniData->Cnum, line + strlen("Cnum="));
}

//..............................
}

fclose(fp);

return 1;
}

int main( int argc, char *argv[] )
{
char *fname = "test.ini"
t_Ini IniData;

ReadIni(fname, IniData);

return 0;
}
    • good
    • 0
この回答へのお礼

kb-nikeさん、回答ありがとうございました。
コメントいただいたソースを元に、実行仕様にアレンジしたところ、無事動きました。
ちなみに、fgets()の引数lineとfpが逆のようです。
とても助かりました。
ありがとうございました。

お礼日時:2010/03/17 10:50

こんなのもあるけど。


http://code.jellycan.com/simpleini/
クロスプラットフォームでMIT License.
    • good
    • 0

訂正です。


[NETWORK]のセクションの3回目のfgets()とAnumへのコピーは不要です。
    • good
    • 0

同志社大学のかなり古いゼミの内容が公開されています。


見た感じANSI準拠ぽいんで使えるんでは?
ライセンスとかは解りません。

http://mikilab.doshisha.ac.jp/dia/seminar/2001/p …
    • good
    • 0

「INI ファイルの読み込み」と「読み込んだ値を適切に設定する」のとでは違うんだけど, 例えば Boost.PropertyTre

e で読み込んでなんとかする.
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング