サンプル集  >  VC  >  iniファイルの読み込みA
iniファイルの読み込みA
2011/06/15

No.473 でiniファイルを読み込むディレクトリの位置を探りましたが、簡単な方法がありました。

◆環境
OS Windows XP Professional Version 2002 Service Pack 3
VC Microsoft Visual C++ 2008 91179-136-7480673-60943

どの位置のiniファイルを読み込んでいるのかを探る為に色々な場所にiniファイルを配置し、 GetPrivateProfileString()関数の戻り値を見ていました。 これはそもそも自分がどのフォルダで実行されているのか分らない事が原因でした。

GetCurrentDirectory()関数を使うと実行時のカレント・ディレクトリが取得できます。 取得した値を見ると自分が何処で実行されたのかが分ります。 この値にiniファイルを名を繋げば、カレント・ディレクトリにあるiniファイルを取得するように出来ます。

IniFileReadTest2.cpp
  1: 
  2: 
  3: 
  4: 
  5: 
  6: 
  7: 
  8: 
  9: 
 10: 
 11: 
 12: 
 13: 
 14: 
 15: 
 16: 
 17: 
 18: 
 19: 
 20: 
 21: 
 22: 
 23: 
 24: 
 25: 
 26: 
 27: 
 28: 
 29: 
 30: 
 31: 
 32: 
 33: 
 34: 
 35: 
 36: 
 37: 
 38: 
 39: 
 40: 
 41: 
 42: 
 43: 
 44: 
 45: 
 46: 
 47: 
 48: 
 49: 
 50: 
 51: 
 52: 
 53: 
 54: 
 55: 
 56: 
 57: 
 58: 
 59: 
 60: 
 61: 
 62: 
 63: 
 64: 
 65: 
 66: 
 67: 
 68: 
 69: 
 70: 
 71: 
 72: 
 73: 
 74: 
 75: 
 76: 
 77: 
 78: 
 79: 
 80: 
 81: 
 82: 
 83: 
 84: 
 85: 
 86: 
 87: 
 88: 
 89: 
 90: 
 91: 
 92: 
 93: 
 94: 
 95: 
 96: 
 97: 
 98: 
 99: 
100: 
101: 
102: 
103: 
104: 
105: 
106: 
107: 
108: 
109: 
110: 
111: 
112: 
113: 
114: 
115: 
116: 
// IniFileReadTest2.cpp : コンソール アプリケーションのエントリ
// ポイントを定義します。
//

#include "stdafx.h"
#include <windows.h>

void ReadIniFile ( LPCTSTR lpIniFileName
                 , LPCTSTR lpAppName
                 , LPCTSTR lpKeyName
                 );

int _tmain( int argc, _TCHAR* argv[] )
{
    // カレント・ディレクトリのフルパスを取得
    DWORD nIniFileNameLen = 256;
    WCHAR pIniFileName[256];
    GetCurrentDirectory( nIniFileNameLen, pIniFileName );
    printf( "path=%S\n", pIniFileName );

    // iniファイル名を連結
    wsprintf( pIniFileName
            , L"%s\\IniFileReadTest2.ini"
            , pIniFileName
            );

    // iniファイル読み込み
    ReadIniFile( pIniFileName, NULL,         NULL );
    ReadIniFile( pIniFileName, L"MAIN_INFO", NULL );
    ReadIniFile( pIniFileName, L"SUB_INFO",  NULL );
    ReadIniFile( pIniFileName
               , L"SUB_INFO"
               , L"SUB-PC-NUMBER"
               );
    ReadIniFile( pIniFileName
               , L"SUB_INFO"
               , L"SUB-PC-NUMBER2"
               );
    ReadIniFile( pIniFileName
               , L"SUB_INFO"
               , L"SUB-PC-NUMBER3"
               );
    ReadIniFile( pIniFileName
               , L"SUB_INFO"
               , L"SUB-PC-NUMBER4"
               );
    ReadIniFile( pIniFileName
               , L"SUB_INFO"
               , L"SUB-PC-NUMBER5"
               );

    // 入力待ちの停止
    getchar();

    return 0;
}

void ReadIniFile( LPCTSTR lpIniFileName
                , LPCTSTR lpAppName
                , LPCTSTR lpKeyName
                )
{
    printf( "App[%S] Key[%S]\n", lpAppName, lpKeyName );

    WCHAR iniInfo[256];
    DWORD ret =
    GetPrivateProfileString( lpAppName
                           , lpKeyName
                           , L"NULL"
                           , iniInfo
                           , sizeof( iniInfo )
                           , lpIniFileName
                           );

    // エラー情報取得
    DWORD lastErr = GetLastError();

    // 結果表示
    printf( "ret=%d LastError=%d\n", ret, lastErr );

    WCHAR word[256];     // 切り出した文字
    memset( word, NULL, sizeof( word ) );

    int   wordCnt  = 0;  // 切り出した文字数
    int   wordFlag = 0;  // 1:文字の開始
    for ( int i = 0; i < ( int )ret; i++ )
    {
        if ( iniInfo[i] == NULL )
        {
            if ( wordFlag == 1 )
            {
                // 文字終了
                wordFlag = 0;

                printf( "[%S]\n", word );

                wordCnt  = 0;
                memset( word, NULL, sizeof( word ) );
            }
        }
        else
        {
            if ( wordFlag == 0 )
            {
                // 文字開始
                wordFlag = 1;
            }
            word[wordCnt] = iniInfo[i];
            wordCnt++;
        }
    }
    if ( word[0] != NULL )
    {
        printf( "[%S]\n", word );
    }
}

iniファイルは以下のようにしました。

IniFileReadTest2.ini
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
[MAIN_INFO]
PC-NUMBER=20110224-006
[SUB_INFO]
SUB-PC-NUMBER=
20110615-001
SUB-PC-NUMBER2=20110615-002
SUB-PC-NUMBER3=   20110615-003
SUB-PC-NUMBER4=20110615 004
SUB-PC-NUMBER5=20110615-005   

SUB-PC-NUMBER5の値は語尾に3文字半角空白が付いています。

実行します。

App[(null)] Key[(null)]
ret=19 LastError=0
[MAIN_INFO]
[SUB_INFO]
App[MAIN_INFO] Key[(null)]
ret=10 LastError=0
[PC-NUMBER]
App[SUB_INFO] Key[(null)]
ret=74 LastError=0
[SUB-PC-NUMBER]
[SUB-PC-NUMBER2]
[SUB-PC-NUMBER3]
[SUB-PC-NUMBER4]
[SUB-PC-NUMBER5]
App[SUB_INFO] Key[SUB-PC-NUMBER]
ret=0 LastError=0
App[SUB_INFO] Key[SUB-PC-NUMBER2]
ret=12 LastError=0
[20110615-002]
App[SUB_INFO] Key[SUB-PC-NUMBER3]
ret=12 LastError=0
[20110615-003]
App[SUB_INFO] Key[SUB-PC-NUMBER4]
ret=12 LastError=0
[20110615 004]
App[SUB_INFO] Key[SUB-PC-NUMBER5]
ret=12 LastError=0
[20110615-005]

以下の事が分りました。

  • App、KeyがNULLだと全てのセッション名をNULL区切りで取得する。
    iniファイルに含まれるセッション名は「MAIN_INFO」(9文字)と「SUB_INFO」(8文字)です。
    GetPrivateProfileStringの復帰値は19です。9+1+8+1で 19 になります。
  • Appを指定し、KeyがNULLだとAppで指定したセッションに含まれるキー名をNULL区切りで取得する。
  • App、Keyを指定するとKey=の後に書かれた文字列を改行まで取得する。
    その際に前後の空白は無視される。

▲ PageTop  ■ Home


Copyright (C) 2012 ymlib.com