この記事は 2021 年 02 月 25 日に投稿しました。
目次
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