예전에는 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파일을 쓰실 땐 적절히 활용하시면 되겠습니다.
'코드^학습 > 메모한 지식' 카테고리의 다른 글
[C++]SHBrowseForFolder함수 (1) | 2016.07.05 |
---|---|
[MFC] File Drag & Drop과 UAC (0) | 2016.06.20 |
[MFC] MDI의 구조 (4) | 2016.05.02 |
[MFC] MDI 리본UI, APP에서 비활성 View 포인터 얻기 (0) | 2016.04.06 |
[MFC]프로그램 실행 흐름 요약 (0) | 2016.04.05 |