INIファイルのキー名取得の方法 – プログラミング – Home

INIファイルのキー名取得の方法
 
通知
すべてクリア

[解決済] INIファイルのキー名取得の方法


クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

どうもです。
早速なのですが・・・質問させていただきます。

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

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

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


引用未解決
トピックタグ
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

すいません。m(__)m
GetPrivateProfileStringを使って出来る事が判りました。
出来るようになったらコードを記述します。


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

キー名が不特定多数なら、GetPrivateProfileSection()を使うべきだと思うのですが...


返信引用
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

sugarさん、ありがとうございます。
GetPrivateProfileSection(strSection, buff, 1024, strFile);
とした場合、次のキーの取得はどうしたら良いのでしょうか?


返信引用
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

補足
char buff[1024];
です。


返信引用
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

ちなみに、キー名とキー値を別々の配列に入れるために、下記のような記述をしています。

/*----------------------------------------------------------------------------*/
// 機能説明
// 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);
}

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


返信引用
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

この関数を呼出す記述は

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

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

です。


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

> 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回のファイルアクセスで一度に値まで取得できますが、
値にパス情報がいくつも含まれるなど、バッファサイズの上限をおびやかす可能性がある場合、
この関数を使う方法は必ずしも得策ではないということになってしまいます。

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


返信引用
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

buffにデータを受けたとして,

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

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


返信引用
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

YuOさん、ありがとうございます。
今回は、GetPrivateProfileSectionを使わない事にしましたが、
それとは関係なく、NULLまでの取得は絶対に今後、必要と思われるので、
しっかりと、覚えておきます。
ありがとうございました。m(__)m


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました