
表題の実現方法について、どうしてもわからなかったので、質問を挙げさせていただきます。
会社から、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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
C for Linuxでの設定ファイル読み込み
C言語・C++・C#
-
GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・
C言語・C++・C#
-
設定ファイルを扱うライブラリについて
C言語・C++・C#
-
4
iniファイルのキーと値を取得するにはどうすれば?
C言語・C++・C#
-
5
iniファイルについて
C言語・C++・C#
-
6
C++ 設定ファイル
C言語・C++・C#
-
7
Linuxで入力待ちなしkeyread関数のようなものはありますか?
C言語・C++・C#
-
8
実行ファイルのパスを取得したい
C言語・C++・C#
-
9
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
10
Linuxでフォルダ内全ファイル名の読み込み
C言語・C++・C#
-
11
WindowsからLinuxへの移植
C言語・C++・C#
-
12
newしないオブジェクトについて
C言語・C++・C#
-
13
C 開放してるのにエラー(double free or corruption (!prev))がでる
C言語・C++・C#
-
14
char*を初期化したいのですが
C言語・C++・C#
-
15
ソケットのrecvの戻り値が0
C言語・C++・C#
-
16
acceptをalarmでタイムアウトさせる処理がうまくいきません
C言語・C++・C#
-
17
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
18
C++ でカンマ ," で区切られたデータファイルを読む方法"
C言語・C++・C#
-
19
C言語で構造体のメンバを簡単に出力する方法ありますか?
C言語・C++・C#
-
20
std::stringからLPCWSTR型への変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
女性は、バイト先でシフトが被...
-
5
いきなりラインのトークに「新...
-
6
APIの意味
-
7
lineを断られた後の対処につい...
-
8
lineを断られた後の対処につい...
-
9
lineを断られた時の対処法につ...
-
10
LINEについてです。いつも通り...
-
11
女性は、バイト先でシフトが被...
-
12
並立と並列の違いってなんですか?
-
13
ラインのアカウントが消えない
-
14
ラインのアカウント削除?連絡...
-
15
Advise me on popular men's co...
-
16
生産ラインの品質を表す直行率...
-
17
64ビットエクセルでのAPI宣言/P...
-
18
あの噂の世界三大チェーンメー...
-
19
他人に成り済ます人の心理が知...
-
20
毎月記念日をlineで祝うのって...
おすすめ情報
公式facebook
公式twitter