INIファイルのキー名取得の方法

[戻る]
クリリン 2002/02/06(水) 12:00:00
どうもです。
早速なのですが・・・質問させていただきます。

現在、INIファイルの情報から、セクション名は決まっていて、キー名は不特定多数という情報か
ら、データを取得、更新をするアプリを作成しています。
よって、どうしてもセクション内のキー名を全て列挙しなければ、いけないのですが、どうした
ら良いのでしょうか?

ちなみに開発はMFCを使っています。

どうか、皆様の良い知恵をお貸しください。よろしくお願いします。

クリリン 2002/02/06(水) 12:47:51
すいません。m(__)m
GetPrivateProfileStringを使って出来る事が判りました。
出来るようになったらコードを記述します。

sugar 2002/02/06(水) 14:53:15
キー名が不特定多数なら、GetPrivateProfileSection()を使うべきだと思うのですが...

クリリン 2002/02/06(水) 17:17:52
sugarさん、ありがとうございます。
GetPrivateProfileSection(strSection, buff, 1024, strFile);
とした場合、次のキーの取得はどうしたら良いのでしょうか?

クリリン 2002/02/06(水) 17:19:37
補足
char buff[1024];
です。

クリリン 2002/02/06(水) 17:23:33
ちなみに、キー名とキー値を別々の配列に入れるために、下記のような記述をしています。

/*----------------------------------------------------------------------------*/
//  機能説明
//    INIファイルよりキー名が不特定多数の場合のキー値を取得する(文字列配列)
//  パラメタ説明
//    CString strSection    : セクション名
//    CString strFIle       : INIファイルパス
//  戻り値
//    int                   : 配列の最大のインデックス値
//   ポインタによる戻り値
//    CStringArray *ArrayKeyName : 配列によるキー名
//    CStringArray *ArrayKeyData : 配列によるキー値
//  備考
//    なし。
/*----------------------------------------------------------------------------*/
int CiniFile::GetIniKeyStrArray(CString strSection, CString strFile, 
                                CStringArray *ArrayKeyName, 
                                CStringArray *ArrayKeyData)
{
  const int MAX_BUFFER_SIZE = 32767;
  int           iRet;
  char          buff[MAX_BUFFER_SIZE];
  char          Getbuff[MAX_BUFFER_SIZE];
  CString       WorkStr;

  // APIによりINIファイルのセクション内にあるキー名取得
  GetPrivateProfileString(strSection, NULL, "", buff, MAX_BUFFER_SIZE, strFile);
  
  for( int i = 0; i <= MAX_BUFFER_SIZE; i++ ){
    WorkStr = CString(buff[i]);   // キー名を細分化
    if( WorkStr == "" ) break;  // 最後ならば抜ける
    // APIによりINIファイルキー値取得
    GetPrivateProfileString(strSection, WorkStr, "", Getbuff, 
                            MAX_BUFFER_SIZE, strFile);
    iRet = ArrayKeyName->Add(WorkStr);          // キー名格納
    iRet = ArrayKeyData->Add(CString(Getbuff)); // キー値格納

    i++;
  }
  return (iRet);
}

として、それぞれをポインタ渡しで行っております。
どうでしょうか?

クリリン 2002/02/06(水) 17:26:48
この関数を呼出す記述は

  CiniFile      m_iniFile;
  CStringArray  gArrayKeyName;
  CStringArray  gArrayKeyData;
  int           gMaxIndex;

  gMaxIndex = m_iniFile.GetIniKeyStrArray(WorkStr, WorkStr2, 
                                          &gArrayKeyName, &gArrayKeyData);

です。

sugar 2002/02/06(水) 18:56:08
> GetPrivateProfileSection(strSection, buff, 1024, strFile);
> とした場合、次のキーの取得はどうしたら良いのでしょうか?
>
「key=value」のセットが、NULLで区切られて連続してbuffに格納されます。
最後には、NULLが2つ格納されます。
↓↓↓
key1=value1<NULL>key2=value2<NULL>key3=value3<NULL><NULL>

Win95環境では、buffに指定できるバッファサイズは32767バイトが上限だそうです。
GetPrivateProfileSection()なら1回のファイルアクセスで一度に値まで取得できますが、
値にパス情報がいくつも含まれるなど、バッファサイズの上限をおびやかす可能性がある場合、
この関数を使う方法は必ずしも得策ではないということになってしまいます。

「この関数を使うべき」という言い方をしてしまいましたが、
必ずしもそうではないということでした。
すみませんでした。

クリリン 2002/02/06(水) 19:08:01
[[解決]]
sugarさん、どうもありがとうございます。
とりあえず、私が記述した方法で行おうと思います。
というのも、取得したキー値を結局、キー名とキー値とに分けなければならず、
おそらく、分ける為のコードが長くなりそうなので・・・
しかも、時間もあまりないものですから・・・
でも、「GetPrivateProfileSection」は少し惹かれていましたので、やっていたのですが、
NULLまでの取得および "=" までの取得などの課題があった為、やめることにしました。
ところで、まだ私は初心者なので、わからないのですが、NULLまでの取得はどうするのでしょ
うか?
支障がなければ、教えてください。

とりあえず、解決ということで・・・

YuO [E-Mail] 2002/02/06(水) 22:49:49
buffにデータを受けたとして,

for (char *ptr = buff; *ptr != 0; ptr += strlen(ptr) + 1)
というループで列挙できます。
#紙に書くなりして,何故これで列挙できるか理解してから使って下さい。

ちなみに,=の位置はstrchrで取得可能です。

クリリン 2002/02/07(木) 16:48:37
[[解決]]
YuOさん、ありがとうございます。
今回は、GetPrivateProfileSectionを使わない事にしましたが、
それとは関係なく、NULLまでの取得は絶対に今後、必要と思われるので、
しっかりと、覚えておきます。
ありがとうございました。m(__)m

古いスレッドには追加発言できません。