
表題の実現方法について、どうしてもわからなかったので、質問を挙げさせていただきます。
会社から、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ファイル内容を読み込みたい。
No.3ベストアンサー
- 回答日時:
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;
}
kb-nikeさん、回答ありがとうございました。
コメントいただいたソースを元に、実行仕様にアレンジしたところ、無事動きました。
ちなみに、fgets()の引数lineとfpが逆のようです。
とても助かりました。
ありがとうございました。
No.2
- 回答日時:
同志社大学のかなり古いゼミの内容が公開されています。
見た感じANSI準拠ぽいんで使えるんでは?
ライセンスとかは解りません。
http://mikilab.doshisha.ac.jp/dia/seminar/2001/p …
No.1
- 回答日時:
「INI ファイルの読み込み」と「読み込んだ値を適切に設定する」のとでは違うんだけど, 例えば Boost.PropertyTre
e で読み込んでなんとかする.お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
C for Linuxでの設定ファイル読み込み
C言語・C++・C#
-
設定ファイルを扱うライブラリについて
C言語・C++・C#
-
GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・
C言語・C++・C#
-
-
4
iniファイルのキーと値を取得するにはどうすれば?
C言語・C++・C#
-
5
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
6
C言語での引数の省略方法
C言語・C++・C#
-
7
int型の内容をbyteの配列にコピー
Java
-
8
GetPrivateProfileString関数
Visual Basic(VBA)
-
9
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
10
fgets関数のEOFの扱い方について
C言語・C++・C#
-
11
C言語でテキストファイルの内容を置換して保存したい
C言語・C++・C#
-
12
ヘッダーファイル『windows.h』について
C言語・C++・C#
-
13
文字列から空白を取り除きたいのですが
C言語・C++・C#
-
14
C言語 配列の長さの上限
C言語・C++・C#
-
15
16進数を10進数に簡単に変換する関数は?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
face book で女性の方からline ...
-
よく05(04)lineって見かけるん...
-
相手側の携帯が電源切れてる時...
-
毎月記念日をlineで祝うのって...
-
1コールだけ鳴るけど切れる電話...
-
生産ラインの品質を表す直行率...
-
風俗に行ったとして、そこで嬢...
-
質問です。 先日クラスの女子に...
-
lineのワン切り、なぜ?
-
「一番上、真ん中、下」を示す英語
-
line でおはようございます、の...
-
いきなりラインのトークに「新...
-
名前を教えてしまったら何に悪...
-
タイトルの改行
-
Windowsのバッチファイルで正規...
-
2000年生まれなのですが 00line...
-
ラインナップとラインアップは...
-
まだそんなに親しくない相手と...
-
ある男子から、ライン追加され...
-
英語で「前から二番目」ってな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
相手側の携帯が電源切れてる時...
-
1コールだけ鳴るけど切れる電話...
-
face book で女性の方からline ...
-
風俗に行ったとして、そこで嬢...
-
生産ラインの品質を表す直行率...
-
いきなりラインのトークに「新...
-
よく05(04)lineって見かけるん...
-
毎月記念日をlineで祝うのって...
-
ラインナップとラインアップは...
-
遠くにいる友達とLINE交換する...
-
Windowsのバッチファイルで正規...
-
「一番上、真ん中、下」を示す英語
-
ある男子から、ライン追加され...
-
line でおはようございます、の...
-
LINEで好きな人が「笑」を全然つ...
-
2000年生まれなのですが 00line...
-
LaTeXでÅ
-
lineのワン切り、なぜ?
-
法線(normal line)はなぜそう...
-
既婚女性にラインを聞くことに...
おすすめ情報