• ベストアンサー

iniファイルのキーと値を取得するにはどうすれば?

こんばんわ、マッイィーです。 毎度のことながらお助けを。 iniファイルのキーと値をとるために必要な関数は 何か教えてください。 その取得したキーと値を配列に格納したいのですが、 いい方法ありませんか? 分かっちゃった!って人、おもいっきり教えてください。 もんどりもっさりに教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★キーの『値』だけを取得して配列に取得したいのですね。 ・szBuff バッファ領域の文字列から=文字を検索して配列に格納すればよい。  ちなみに配列には文字列でセットしますか?  それとも整数値に変換した値をセットしますか?  どっち。 ・とりあえず、下にサンプルを載せておくので使い分けて下さい。 サンプル: TCHAR szBuff[ 32768 ]; LPTSTR lpSeek; LPTSTR lpFind; LPTSTR *s[ 100 ]; ←文字列として格納 INT n[ 100 ]; ←整数として格納 INT i = 0; ←カウンタ GetPrivateProfileSection( TEXT("セクション名"), szBuff, sizeof(szBuff), TEXT("INIファイル名") ); for ( lpSeek = szBuff ; *lpSeek != '\0' ; lpSeek++ ){  if ( (lpFind = strchr(lpSeek,'=')) != NULL ){ ←=文字を検索   s[ i ] = lpFind + 1;   n[ i ] = atol( lpFind + 1 );   i++;  }  while ( *lpSeek != '\0' ){ ←次のキーデータに移動するための処理   lpSeek++;  } } printf( "max=%d\n", i ); ←i カウンタがそのままキーデータの個数になる。 解説: ・前回のサンプルに文字列や整数値を配列にセットする部分を追加しただけ。  lpSeek に1つ1つのキーデータの文字列になるので、=文字を strchr 関数で  検索して=文字の次の1文字目がデータ(値)になります。 ・あとは文字列の配列(s)や、整数の配列(n)にセットしているだけです。  配列の要素数は 100 個にしています。セクション内にいくつのキーデータがあるか  不明ですので多めに宣言しておくか、最初に個数をカウントしてから malloc 関数で  確保してからセットして下さい。 最後に: ・ここは 2チャンネルのような掲示板ではありませんよ。  質問、補足、お礼などの文章をもう少し『品』がある文章にすると読みやすくなります。  ここの辺も気をつけて下さい。 ・以上。今後の参考に!

matsuhira
質問者

お礼

回答ありがとうございます。 書き方注意させてしまってすいません。 なんだか少しでも楽しくと考えて今回はOKWaveに挑んでみました。 いるでしょ?回答がすっごく嫌味を含んでる人とか。 「こんなこともわからないんですか?」とか 「意味ないこと書かないでください」なんてこと。 ああいうの見てると、胸がムカムカしてきて どこに怒ればいいのか矛先を見失い、 イカレ踊り狂うことになっちゃうんですよ。 そんなの嫌だから、楽しくやろう!って決めたんです。 いろんな人たちが集まる場だから礼儀を守ってって よく分かるんですけど、それ無視してる奴は ほっとけばいいじゃんって暗黙のルールみたいに 今の現状ではそうなっちゃってる。 そっちの方が絶対おかしい!って憤慨ですよ。まったく。 レフリー制度だけじゃ甘いですよ。 ってここで怒ってもしょうがないですから、 それ専用の掲示板作ってください。 俺みたいな無能には100年かかっても無理ですから。 人助けを心からしてくださる人たちにはとても感謝してます。 今回の質問は一度打ち切ろうとおもいます。 分からないことまだあるけど、長くなると迷惑ですからね。 それじゃまた。 すぐ会うことになると思いますけど(笑)その日まで。

その他の回答 (5)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★お礼への補足 >今回の質問は一度打ち切ろうとおもいます。 >分からないことまだあるけど、長くなると迷惑ですからね。  打ち切る必要はないですよ。  長くなっても一通りの解決するまではアドバイスなどを、できるかぎりしますが…。 ・ただ、質問文の >分かっちゃった!って人、おもいっきり教えてください。 >もんどりもっさりに教えてください。  ↑の2行が気になったのです。 ・確かにいろいろな人がいますがね。 本題: ・さてと本題のキーから値の取得方法は分かりましたか。重要なのはここですね。  サンプルをそのまま使っても、こそこそ使えますがエラーチェックや、データ数が  100 以上の場合は想定していませんので、適当に改良を付け加えて下さい。 ・分からないことがあれば、またどうぞ。 ・以上。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★アドバイス ・matsuhira さんは MSDN マニュアルを先に見てから質問をしてみたらどうですか。  前回の質問で GetPrivateProfileSectionNames() 関数を紹介したとき、MSDN のサイト  ですので、そこの検索システムを使えば見つかりますよ。  下の『参考URL』に MSDN のレジストリ関連を貼っておきます。ここを探せば INI ファイルの  キーと値を取得する API 関数が見つかります。そして、1度でよいので読んで下さい。  その上で使い方が分からない場合に質問を。 ●本題 ・キーと値を配列に格納したいようですが、どんな形式で格納したいのですか?  LPTSTR lpKeyData[ 10 ]; ←文字列ポインタへの配列(10個)    lpKeyData[ 0 ] ⇒ keyname1=string1  lpKeyData[ 1 ] ⇒ keyname2=string2  lpKeyData[ 2 ] ⇒ keyname3=string3   :  lpKeyData[ 9 ] ⇒ keyname9=string9  という形式ですか。  この場合は回答者 No.1、No.2 さんの方法で取得できます。 ・あとすべてのキーと値を一度に取得する方法は回答者 No.3 さんが既に紹介されている方法で  取得できます。取得したバッファ領域の形式は、前回紹介した GetPrivateProfileSectionNames()  関数と同じです。つまり、複数の文字列を NULL 文字で区切り、最後に全体の最後を表す NULL  文字が1つ付けられます。 サンプル: TCHAR szBuff[ 32768 ]; ←適当にサイズを決めておく LPTSTR lpSeek; GetPrivateProfileSection( TEXT("セクション名"), szBuff, sizeof(szBuff), TEXT("INIファイル名") ); for ( lpSeek = szBuff ; *lpSeek != '\0' ; lpSeek++ ){  printf( "%s\n", *lpSeek ); ←lpSeek が『キー』と『値』の文字列です。    while ( *lpSeek != '\0' ){ ←次のキーデータに移動するための処理   lpSeek++;  } } その他: ・上記のサンプルをコンソール・アプリケーションで作成すると、指定のセクション名のキーと値を  画面に出力します。それも順番に出力していきます。  サンプルのように GetPrivateProfileSection() API を利用すると1つずつを配列にセットしなくても  よくなります。一度に取得して lpSeek などで位置を移動すれば、すべてのキーを列挙できます。 ・1つ1つの操作を行いたい場合は、GetPrivateProfileInt()、GetPrivateProfileString() の関数で  行う方が簡単です。特に整数値として値を取得したい場合は GetPrivateProfileInt() API 関数に  任せた方が楽です。それからエラーチェックはご自分でつけて下さい。 ・以上。参考に。

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpsysinf/html/_win32_getprivateprofilesectionnames.asp
matsuhira
質問者

補足

回答ありがとうございます。 前回もお世話になってすいません。 MSDN見ました。理解できる部分10%ぐらいです。(はぁ~) 使い方はわかりましたけど、どうプログラムに生かすか・・・ そこですねぇ~。 サンプル見た感じですと、セクション内にあるキーと値をszBuffに 格納するということですね。 私のやりたいことは、ずばりその先にある!!! 取ってきたキーと値をは=でつながれているはずですから、 それをとっぱらってキーと値をそれぞれの配列に格納したいんですよ。 これが実際にやりたいことなんです!!! 伝わりますか?説明苦手でどうも・・・こう・・・。 何か分からないことあったらどんどん質問お願いします。 もっさりお願いします。。。

回答No.3

GetPrivateProfileSection を使えば .ini ファイル(初期化ファイル)の、指定されたセクション内のすべてのキーと値を取得できます。 MSDNによると 関数から制御が返ると、このバッファに、指定したセクション内に存在するすべてのキー名と値のペアが格納されます。 キー名と値の間に等号(=)が挿入されます。各ペアの後に NULL が追加されます。 その結果、このバッファには、NULL で終わる文字列が 1 つまたは複数格納されます。 バッファの最後には、もう 1 つの NULL が追加されます。 なので、等号(=)とNULLによってバッファ内の文字列を分離しながら配列に入れていけば良さそうです。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

>あの・・・配列に格納するやり方は知らないかなぁ? 数値なら int hairetu[10]; hairetu[0] = GetPrivateProfileString(...);//キーワード1の分 hairetu[1] = GetPrivateProfileString(...);//キーワード2の分 hairetu[2] = GetPrivateProfileString(...);//キーワード3の分 では、ダメですか?

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

文字でとるなら、GetPrivateProfileString 数値でとるなら、GetPrivateProfileIntを 使用して下さい。

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpsysinf/html/_win32_getprivateprofilestring.asp
matsuhira
質問者

補足

さっそくの回答、ありがとう! そうだ!そうだ!って思い出したんだ、さっき。 あの・・・配列に格納するやり方は知らないかなぁ? もし知ってたらお願いできないかぁ?

関連するQ&A

  • VB2008 iniファイルの指定セクション内の値のみを取得

    VB2008 iniファイルの指定セクション内の値のみを取得 VB2008でiniファイルの読込みを行いたいと思っています。 指定セクション内の値のみを取得したいのですが、自分の知る限りではキー名も一緒についてきて しまいます。 簡単に値のみを取得する方法を助言いただきたいと思います。 自分が検討した一番近かった方法は、GetPrivateProfileSection関数を使用し、キー名と値を取得。 ↑ただし、キー名はいらない。 関数で出来ればいいのですが、出来なければ、プログラミングで値のみを抜き取る方法でもいいので なるべく簡単な方法を宜しくお願いします。   

  • 連想配列からの値の取り出し

    お世話様です。 タイトルにもありますが連想配列を作成した後(以下に記述例)に その配列からキーを指定して値を取得したいと思っております。 array_keys関数だと値を指定してキーを取得するみたいで うまくいきませんでした。 何かよい方法ありませんでしょうか? //配列に格納 while (条件) {   $aParaOra += array((キー) => (値)); }

    • ベストアンサー
    • PHP
  • iniファイルへの追記について

    FORM上の保存ボタンをクリックしたら、フォームに入力したデータがiniファイルへ追記していくというものを作りたいのですがわかりかねています。 フォームのソースで作っていこうとしていて、 ソースの始めは public sub Command保存_Click() で始まり、End sub で終りますよね? そこで フォーム上の値、例えば、3 を変数 a_col に格納します。ここまではできます。 この格納したものをiniファイルと同じものをあらわす名前のini_colに格納し、iniファイルに ini_col=3と表示したいのです。 iniファイルから、フォームへ取り込むところまではなんとかできました。 初心者ですのでアドバイスおねがいします。

  • INIファイルからのデータ読込みについて

    表題の実現方法について、どうしてもわからなかったので、質問を挙げさせていただきます。 会社から、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ファイル内容を読み込みたい。

  • powershellとiniファイル

    ps1よりiniファイルを読み込むスクリプトを作成中です。 iniファイルには以下の記載をしています。 いわゆる連想配列です。 $info = @{} $info[0] = @{ host=testest1 ip=192.168.0.0 } $info[1] = [ host=testest2 ip=192.168.0.1 } 一方、ps1は以下の通り、コードを記述しています。 $INI_PATH = @(Split-Path $script:myInvocation.MyCommand.Path -Parent).Trim() $INI_FILE = "ini_test2.ini" $INI_FULLNAME = $INI_PATH + "\" + $INI_FILE $PARAMETER = @{} Get-Content $INI_FULLNAME | %{$PARAMETER += ConvertFrom-StringData $_} $host_info = $PARAMETER.info[0] #値格納 $host_info いざ、実行すると、 「ConvertFrom-StringData : データ行 '}' の形式が '名前=値' ではありません。」、「項目は既に追加されています。」とのエラーが出ます。 どのように変えればエラーがなくなりますでしょうか。 Powershellの初歩的な質問で申し訳ないのですが、ご回答をよろしくお願いいたします。

  • 「至急」Iniファイルの読み出す

    下記のIniファイルを作って、C:\hotant.iniを保存します [セッション1] key1=111 key2=222 [セッション2] key3=333 key4=444 Javaでどうやってこの[セッション1]のkey1とkey2の値を読み出せますか?簡単なソースがあれば、教えてください。 ありがとうございます。

    • ベストアンサー
    • Java
  • INIファイルの読込みについて

    VB2005を使用しています。 INIファイルを読み込む関数で、GetPrivateProfileStringとGetPrivateProfileIntがありますが、この二つは文字列用、数値用と、なんとなく曖昧に憶えておりました。VBでINIファイルを読み込んだ場合、どちらも文字列、数値として取得できてしまうのですが、1つのプロジェクトでこれらを使い分ける意味はあるのでしょうか? できれば一つの関数で読込みを統一したいと思うので。。。 使い分ける意味があるとしたら、その理由についてもできれば教えてください。宜しくお願いいたします。

  • parse_ini_file関数について

    parse_ini_file関数について質問させてください。 iniファイルの多次元配列の取得で悩んでいます。 sample.iniの内容 ---------------------- 0=aaa,bbb 1=ccc,ddd 2=eee,fff ---------------------- $ini = parse_ini_file('sample.ini', true); として配列を取得しようとしたのですが、 print("{$ini[0][0]}");としてみると 欲しい結果は「aaa」ですが「a」となってしまいます。 また、print($ini[0]);とすると 結果が配列ではなく「aaa,bbb」のまま表示されてしまいます。 どうも配列として読み込んでないようです。 どなたかご教示していただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 取得した値によって表示するhtmを変更する方法。

    いつもお世話になっております。 今、以下のようなものを作れるかどうか方法を探しております。 メモ帳など、どこでも良いのですが(現時点ではINIファイルに格納されています)値を取得し、 その値によって表示するhtmlを変更することは可能でしょうか? 私のイメージだと曜日によってhtmlが変わる、といったものを作成するような感じで考えています。 どなたかお分かりでしたら、教えてください。 宜しくお願いします。

  • parse_ini_fileでダブルクォートを含む値

    parse_ini_fileで読取る設定ファイルでは、 ダブルクォートを含む値を用いることはできないのでしょうか。 ダブルクォートを含んだ値を記述したかったのですが、 設定ファイルのパースエラーになるか、途中で値が切れてしまいました。 以下を試しました。 (PHP 5.0.4 です。) <テストコード> <?php print_r(parse_ini_file("test.ini")); ?> <設定ファイル test.ini の内容> (ダブルクォートを含む) key=val"ue --> 値がvalになる (ダブルクォートをエスケープ) key=val\"ue -->値がval\になる (全体をダブルクォートで囲んで中のダブルクォートをエスケープ) key="val\"ue" -->値がval\になる (全体をダブルクォートで囲んで中のダブルクォートを二連化) key="val""ue" -->パースエラーが発生し、値がvalになる (全体をシングルクォートで囲む) key='val"ue' -->値が'valになる マニュアルで以下の文が気になったのですが・・。 ( http://jp.php.net/manual/ja/function.parse-ini-file.php ) ----- 引用 ここから ----- 次の文字 {}|&~![()" は、キーで使ってはいけません。 また、値の中で特別な意味を持ちます。 ----- 引用 ここまで ----- ダブルクォートが「値の中で特別な意味」を持つ文字として 指定されていますが、具体的にどのような意味を持つのか分かりませんでした。 ですが、キーとしては禁止されているものの、値に含まれる文字としては禁止されていないようだったので・・。 どなたか詳しい情報ご存知の方いましたらご教授ください。

    • ベストアンサー
    • PHP

専門家に質問してみよう