- ベストアンサー
iniファイルのキーと値を取得するにはどうすれば?
こんばんわ、マッイィーです。 毎度のことながらお助けを。 iniファイルのキーと値をとるために必要な関数は 何か教えてください。 その取得したキーと値を配列に格納したいのですが、 いい方法ありませんか? 分かっちゃった!って人、おもいっきり教えてください。 もんどりもっさりに教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
★キーの『値』だけを取得して配列に取得したいのですね。 ・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チャンネルのような掲示板ではありませんよ。 質問、補足、お礼などの文章をもう少し『品』がある文章にすると読みやすくなります。 ここの辺も気をつけて下さい。 ・以上。今後の参考に!
その他の回答 (5)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★お礼への補足 >今回の質問は一度打ち切ろうとおもいます。 >分からないことまだあるけど、長くなると迷惑ですからね。 打ち切る必要はないですよ。 長くなっても一通りの解決するまではアドバイスなどを、できるかぎりしますが…。 ・ただ、質問文の >分かっちゃった!って人、おもいっきり教えてください。 >もんどりもっさりに教えてください。 ↑の2行が気になったのです。 ・確かにいろいろな人がいますがね。 本題: ・さてと本題のキーから値の取得方法は分かりましたか。重要なのはここですね。 サンプルをそのまま使っても、こそこそ使えますがエラーチェックや、データ数が 100 以上の場合は想定していませんので、適当に改良を付け加えて下さい。 ・分からないことがあれば、またどうぞ。 ・以上。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・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 関数に 任せた方が楽です。それからエラーチェックはご自分でつけて下さい。 ・以上。参考に。
補足
回答ありがとうございます。 前回もお世話になってすいません。 MSDN見ました。理解できる部分10%ぐらいです。(はぁ~) 使い方はわかりましたけど、どうプログラムに生かすか・・・ そこですねぇ~。 サンプル見た感じですと、セクション内にあるキーと値をszBuffに 格納するということですね。 私のやりたいことは、ずばりその先にある!!! 取ってきたキーと値をは=でつながれているはずですから、 それをとっぱらってキーと値をそれぞれの配列に格納したいんですよ。 これが実際にやりたいことなんです!!! 伝わりますか?説明苦手でどうも・・・こう・・・。 何か分からないことあったらどんどん質問お願いします。 もっさりお願いします。。。
- Hayashi_Trek
- ベストアンサー率44% (366/818)
GetPrivateProfileSection を使えば .ini ファイル(初期化ファイル)の、指定されたセクション内のすべてのキーと値を取得できます。 MSDNによると 関数から制御が返ると、このバッファに、指定したセクション内に存在するすべてのキー名と値のペアが格納されます。 キー名と値の間に等号(=)が挿入されます。各ペアの後に NULL が追加されます。 その結果、このバッファには、NULL で終わる文字列が 1 つまたは複数格納されます。 バッファの最後には、もう 1 つの NULL が追加されます。 なので、等号(=)とNULLによってバッファ内の文字列を分離しながら配列に入れていけば良さそうです。
- tatsu99
- ベストアンサー率52% (391/751)
>あの・・・配列に格納するやり方は知らないかなぁ? 数値なら int hairetu[10]; hairetu[0] = GetPrivateProfileString(...);//キーワード1の分 hairetu[1] = GetPrivateProfileString(...);//キーワード2の分 hairetu[2] = GetPrivateProfileString(...);//キーワード3の分 では、ダメですか?
- tatsu99
- ベストアンサー率52% (391/751)
文字でとるなら、GetPrivateProfileString 数値でとるなら、GetPrivateProfileIntを 使用して下さい。
補足
さっそくの回答、ありがとう! そうだ!そうだ!って思い出したんだ、さっき。 あの・・・配列に格納するやり方は知らないかなぁ? もし知ってたらお願いできないかぁ?
お礼
回答ありがとうございます。 書き方注意させてしまってすいません。 なんだか少しでも楽しくと考えて今回はOKWaveに挑んでみました。 いるでしょ?回答がすっごく嫌味を含んでる人とか。 「こんなこともわからないんですか?」とか 「意味ないこと書かないでください」なんてこと。 ああいうの見てると、胸がムカムカしてきて どこに怒ればいいのか矛先を見失い、 イカレ踊り狂うことになっちゃうんですよ。 そんなの嫌だから、楽しくやろう!って決めたんです。 いろんな人たちが集まる場だから礼儀を守ってって よく分かるんですけど、それ無視してる奴は ほっとけばいいじゃんって暗黙のルールみたいに 今の現状ではそうなっちゃってる。 そっちの方が絶対おかしい!って憤慨ですよ。まったく。 レフリー制度だけじゃ甘いですよ。 ってここで怒ってもしょうがないですから、 それ専用の掲示板作ってください。 俺みたいな無能には100年かかっても無理ですから。 人助けを心からしてくださる人たちにはとても感謝してます。 今回の質問は一度打ち切ろうとおもいます。 分からないことまだあるけど、長くなると迷惑ですからね。 それじゃまた。 すぐ会うことになると思いますけど(笑)その日まで。