プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

C++/CLI で INI ファイルのセクション名を全て取得する

この記事は 2021 年 02 月 25 日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. C++/CLI で円周率の定数を使用する
  3. おわりに

1. はじめに

こんにちは、iOS のエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用している C++/CLI で INI ファイルのセクション名を全て取得する方法についてです。

目次へ

2. C++/CLI で INI ファイルのセクション名を全て取得する

C++/CLI で INI ファイルのセクション名を全て取得するには、GetPrivateProfileSectionNames関数を使用します。

書式

DWORD GetPrivateProfileSectionNames(
    LPTSTR lpszReturnBuffer,
    DWORD nSize,
    LPCTSTR lpFileName
);

引数

lpszReturnBuffer
取得したセクション名が格納されるバッファへのポインタ
セクション名とセクション名は NULL 文字で区切られます。
終端には文字列の終端を示す NULL 文字が付加されます。

nSize
lpszRetrunBuffer のサイズ(文字数)

lpFileName
INI ファイルのファイルパス名

戻り値

成功した場合は取得したセクション名の文字数が返却されます。
文字数に終端の NULL 文字は含みません。
取得したセクション名よりバッファサイズが小さい場合はnSize - 2 が返却されます。

実装例

INI ファイル
[Section1]
key11=value11

[Section2]
key21=value21

[Section3]
key31=value31
main.cpp
#include <Windows.h>
#include <msclr/marshal_cppstd.h>
#include <tchar.h>

using namespace System;
using namespace System::Collections::Generic;

/**
 * @brief INIファイルのセクション名を全て読み出す。
 *
 * @param [in] filePathName INIファイルパス名
 * @param [out] 読み出したセクション名のリスト
 * @return 処理結果(true:成功/false:エラー)
 */
bool GetSectionNames(String^ filePathName, List<String^>^% sectionNames)
{
    // ファイルパス名をTCHAR配列に変換する。
    pin_ptr<const TCHAR> filePathNameChars = PtrToStringChars(filePathName);

    // 取得したセクション名を格納するバッファを用意する。
    TCHAR returnValue[1024];
    int returnValueLen = sizeof(returnValue) / sizeof(TCHAR);
    SecureZeroMemory(returnValue, returnValueLen);

    // INIファイルのセクション名を全て読み込む。
    DWORD result = GetPrivateProfileSectionNames(&returnValue[0], returnValueLen, filePathNameChars);

    // 読み込んだセクション名がバッファサイズを超える場合
    if (result == (returnValueLen - 2))
    {
        // エラーで終了する。
        return false;
    }

    // 読み込んだセクション名はNULL区切りの文字列になっているので、1つずつの文字列に変換する。
    for (TCHAR* pSeek = returnValue; *pSeek != NULL; pSeek += _tcslen(pSeek) + 1)
    {
        sectionNames->Add(gcnew String(pSeek));
    }
    return true;
}

[STAThreadAttribute]
int main()
{
    String^ iniFileName = ".\\Sample.ini";
    List<String^>^ sectionNames = gcnew List<String^>();
    GetSectionNames(iniFileName, sectionNames);

    // 読み込んだセクション名を表示する。
    for each (String ^ sectionName in sectionNames)
    {
        Console::WriteLine(sectionName);
    }

    Console::ReadKey();
    return 0;
}

実行結果

Section1
Section2
Section3

API Reference

GetPrivateProfileSectionNames関数

目次へ

3. おわりに

INI ファイルの処理を改善しようとしていて、この関数を見つけました。

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。

目次へ


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッド OS [Bi-OS][bi-os]は高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOS モバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ