[C++] 환경 설정 파일(ini)을 사용하는 방법


Development note/C , C++ , MFC  2020. 4. 22. 18:07

안녕하세요. 명월입니다.


이 글은 C++에서 환경 설정 파일(ini)을 사용하는 방법에 대한 글입니다.


최근 C#이나 Java의 경우는 환경 설정 파일을 xml이나 json형태의 텍스트 형태가 많습니다.

C++의 경우도 환경 설정 파일을 xml이나 json형태의 텍스트를 사용할 수 잇는데 기본 함수로 제공하는 환경 파일은 ini 파일입니다.


ini파일은 텍스트로 구성되어 있고 세션(section) 밑에 키로 값을 설정하는 구조입니다.

[세션]
키=값

[세션]
키=값

INI(Initialization) 파일 포맷은 설정 파일에 대한 de facto 표준입니다. INI 파일은 단순 구조의 텍스트 파일로 이루어져 있습니다.

보통 마이크로소프트 윈도우와 연결되어 있지만 다른 운영 체제에서도 사용할 수 있습니다. "INI 파일"이라는 이름은 ".INI"라는 파일 확장자가 따라오지만, ".CFG", ".conf"[1][2], ".TXT"[3] 등의 다른 확장자를 사용하기도 합니다.

출처 - https://ko.wikipedia.org/wiki/INI_파일

#include <stdio.h>
#include <iostream>
#include <crtdbg.h>
#include <Windows.h>
// 메모리 릭을 콘솔에 표시하기 위한 함수
#if _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#endif
using namespace std;
#define BUFFERSIZE 1024
// 실행 함수
int main()
{
  // unicode를 사용하기 위한 변수
  wchar_t unicodedata[BUFFERSIZE];
  // utf8를 사용하기 위한 변수
  char utf8data[BUFFERSIZE];
  // 메모리 초기화
  memset(unicodedata, 0x00, BUFFERSIZE);
  memset(utf8data, 0x00, BUFFERSIZE);
  // uncode데이터를 넣는다.
  memcpy(unicodedata, L"Hello world", BUFFERSIZE);
  // unicode를 utf8로 변환한다.
  WideCharToMultiByte(CP_UTF8, 0, unicodedata, wcslen(unicodedata) * 2, utf8data, BUFFERSIZE, NULL, NULL);
  // ini 파일 작성하여 Secion의 세션에 키는 key로 데이터를 넣는다.
  WritePrivateProfileStringA("Section", "key", utf8data, "d:\\work\\test.ini");
  // 메모리 초기화
  memset(unicodedata, 0x00, BUFFERSIZE);
  memset(utf8data, 0x00, BUFFERSIZE);
  // Section의 세션의 키는 key의 데이터를 가져온다. 키가 없을 경우에는 디폴트로 ""를 취득한다.
  GetPrivateProfileStringA("Section", "key", "", utf8data, 1024, "d:\\work\\test.ini");
  // utf8 타입의 값을 unicode로 변환한다.
  MultiByteToWideChar(CP_UTF8, 0, utf8data, strlen(utf8data), unicodedata, 1024);
  
  // ini 파일 작성하여 Secion의 세션에 키는 key1로 데이터를 넣는다.
  WritePrivateProfileStringA("Section", "key1", "1000", "d:\\work\\test.ini");
  // int형 타입으로 취득 할 수 있다.
  int ret = GetPrivateProfileIntA("Section", "key1", 0, "d:\\work\\test.ini");
	
  // 콘솔 출력
  wprintf(L"string result - %s\r\n", unicodedata);
  wprintf(L"int result - %d\r\n", ret);
  
  // struct 타입
  typedef struct Node
  {
    int data = 101;
    int data2 = 102;
  };
  // Node 구조체 선언
  Node a;
  // 값 설정
  a.data = 1000;
  a.data2 = 1001;
  // 그대로 넣는다.
  WritePrivateProfileStructA("Section", "struct", &a, sizeof(a), "d:\\work\\test.ini");
  // 메모리 초기화, data와 data2는 0이 될 것이다.
  memset(&a, 0x00, sizeof(Node));
  // 값을 다시 취득
  GetPrivateProfileStructA("Section","struct",&a,sizeof(Node), "d:\\work\\test.ini");
  // 콘솔 출력
  wprintf(L"Node data - %d, data2 - %d\r\n", a.data, a.data2);

  _CrtDumpMemoryLeaks();
  return 0;
}

한글을 테스트 해보고 싶지만 현재 제 OS가 영어 버전이라서 한글이 콘솔에 표시가 되지 않습니다.

아마 문제없이 한글도 테스트하면 표시가 될 것입니다.


ini파일은 없으면 자동으로 생성되고 있으면 기존 파일에 수정합니다.

세션이나 키의 경우도 없으면 추가하고 있으면 기존의 내용을 수정합니다.


환경 파일을 작성하는 함수는 WritePrivateProfileString가 있고 WritePrivateProfileStruct가 있습니다.

뒤에 A가 있는 이유는 const char*타입을 사용하기 위해서입니다. utf8는 const char* 타입으로 설정합니다.

만약 unicode를 사용하려면 A대신에 W가 붙어 있는 함수를 사용하면 됩니다.


설정 파일을 취득하는 함수는 GetPrivateProfileString, GetPrivateProfileInt, GetPrivateProfileStruct입니다.

String은 문자열을 Int는 정수형을 취득합니다. (실수형은 없네요..)

Struct는 C++의 Struct 타입을 그대로 넣고 사용합니다.


이제는 ini파일을 확인해 보겠습니다.

struct 타입의 struct은 텍스트 상으로는 데이터를 확인하기 힘드네요.. C++에서 Node 타입으로 변환해야 알 수 있습니다.


여기까지 C++에서 환경 설정 파일(ini)을 사용하는 방법에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.