본문 바로가기

코드^학습/메모한 지식

[MFC] GetPrivateProfileString 함수 사용

예전에는 Windows 프로그래밍에서 INI파일 포멧이 많이 쓰였다고 합니다.

요즘에는 쓰이긴 하지만 예전처럼 중요한 정보를 담는데에는 쓰이지 않습니다. 이 파일이 언제부터 쓰였는지는 알지 못하지만


아무튼 예전에는 자주 쓰였던것만은 확실합니다. 아무튼간에...

제가 요즘 이 파일포멧을 이용하여 데이터를 처리할 일이 생겼습니다.


섹션, 키, 키에 매칭하는 데이터 세가지 요소로 되어있는 이 포멧은 제가 만들던 프로그램에 매우 유용한 포멧입니다.

그래서 이 포멧을 다루어야겠죠. 그러면 파일관련 함수가 필요하겠죠...?

는 아닙니다. INI파일은 따로 접근하는 함수를 지원해줍니다.


그 함수가 바로 제목에 있는 GetPrivateProfileString 함수 입니다.

WritePrivatePrifileString도 있습니다. 함수의 서두부분에서 알 수 있듯이 하나는 INI파일에서 데이터를 얻어오고 하나는 데이터를 씁니다.


저는 Write는 잘 쓰지 않았기 때문에 GetPrivateProfileString에 대해서만 다뤄보겠습니다.

MSDN 링크는 이걸 보시면 됩니다.


INI는 어떤 형태를 띄느냐면


[Section1]

key1 = Data1

key2 = Data2


[AnotherSection]

key3 = Data3

key4 = Data4

요런 형태를 가지고 있습니다.


이 포멧에 맞춘 내용을 읽어오는 함수의 정의는 이렇게 생겼죠.

DWORD WINAPI GetPrivateProfileString(

  _In_  LPCTSTR lpAppName,            // Section의 이름(만약 NULL이 들어간다면!!)

  _In_  LPCTSTR lpKeyName,             // Key의 이름 (만약 NULL이 들어간다면!!)

  _In_  LPCTSTR lpDefault,                // 읽기에 실패할 경우 버퍼에 들어갈 디폴트 데이터

  _Out_ LPTSTR  lpReturnedString,     // 읽은 내용이 들어갈 버퍼

  _In_  DWORD   nSize,                   // 읽기 버퍼의 사이즈

  _In_  LPCTSTR lpFileName              // INI파일이 위치하는 경로

);

를 담아주시면 되겠습니다.


음 인자설명의 주석에 이상한게 보이실겁니다.

이 함수는 NULL이 들어갔을 때 버퍼에 담아주는 값이 특별하기 때문에 좋은 함수라 할 수 있습니다.


lpAppName에 NULL을 넣고 함수를 실행할 경우 lpKeyName에 들어간 내용은 신경쓰지 않고 INI파일의 모든 섹션명을 버퍼에 담아서 돌려줍니다.

저 위에서 예시로 쓴 INI파일에다가 GetPrivateProfileString( NULL, _T("-"), _T("-"), szReads, MAX_READ_SIZE, m_strINIPath );  이런식으로 함수를 호출하면

szReads라는 버퍼에는 Section1\0AnotherSection\0 이렇게 들어있습니다. NULL문자를 기준으로 파싱하면 되겠습니다.


그렇다면 lpKeyName에 NULL을 넣으면 어떻게 될까요? 예 짐작하시는대로입니다(뭐가?)

해당 섹션이 가진 모든 Key의 이름을 넣어줍니다. 역시 Key 사이사이에 \0, NULL이 존재하므로 그것을 파싱해주시면 구분이 가능하겠습니다.


참 좋은 함수입니다. 동적인 데이터를 상대할 땐 개수파악, 데이터의 Key파악해주는 함수가 있다면 참 좋죠. 그렇습니다.


아무튼 INI파일을 쓰실 땐 적절히 활용하시면 되겠습니다.