[WinAPI] GetPrivateProfileSection, Section안의 모든 문자 읽어오기

[WinAPI] GetPrivateProfileSection, Section안의 모든 문자 읽어오기

이번글에서는 GetPrivateProfileSection에 대해 알아보겠습니다.

GetPrivateProfileString을 사용하여 ini에 값을 읽어오는 글을 쓴 적이 있습니다.(링크)
GetPrivateProfileString은 하나의 section과 하나의 key값에 대해 값을 읽어오는 것을 해봤습니다.

GetPrivateProfileSection은 GetPrivateProfileString, GetPrivateProfileInt와 비슷하지만 Key가 없이 Section의 내용을 모두 읽어온다는 것이 특징입니다.

함수 원형은 아래와 같습니다.

DWORD GetPrivateProfileSection (
	LPCTSTR lpAppName, // 섹션 이름
	LPTSTR  lpReturnedString, // 반환 문자
	DWORD   nSize, // 반화 문자 버퍼 크기(최대 32767)
	LPCTSTR lpFileName // 파일명
);

반환값은 버퍼에 복사된 문자수 입니다. 만약 버퍼 크기가 충분치 않으면 nSize – 2값이 반환 됩니다.
예시를 만들어보겠습니다. 우선 아래와 같이 Set.ini을 만들어줍니다.

[SECTION1]
KEY1=1
KEY2=2
KEY3=3

그리고 아래와 같이 코딩을 해줍니다.

TCHAR tzReturn[32767] ={0,};
DWORD dwSize = ::GetPrivateProfileSection( _T( "SECTION1" ), tzReturn, 32767, _T( ".\\Set.ini" ) );

유의 사항은, 이렇게 읽어오면 뉴라인(\n)이 들어올것 같지만 널문자열(\0)이 들어옵니다.

반환값으로 반환한 문자수가 들어오므로 반환값 내에 있는 널문자열은 뉴라인으로 바꿔주거나, 따로 처리를 줘야하합니다.
저는 기존과 똑같이 뉴라인으로 처리해줬습니다.

for( int iLoop = 0; iLoop < dwSize - 1; iLoop++ )
{
	if( _T( '\0' ) == tzReturn[iLoop] )
		tzReturn[iLoop] = _T( '\n' );
}

사실 다른 블로그에선 GetPrivateProfileSection을 모든 Key와 Value를 읽어온다고 알려주지만 꼭 Key를 입력할 필요는 없습니다.

예를 들어 Set.ini에 아래와 같이 학생 정보가 있다고 합시다.

[STUDENT]
홍길동	20	서울	컴퓨터공학	1학년
임꺽정	25	대전	영어영문	4학년
장보고	22	대구	정보처리	3학년
이순신	23	부산	해양경찰	4학년

이렇게 어떠한 종류의 데이터를 ini에 입력하고 아래와 같이 처리를 하면 쉽게 데이터를 가져올 수 있습니다.

TCHAR tzReturn[32767] ={0,};
DWORD dwSize = ::GetPrivateProfileSection( _T( "STUDENT" ), tzReturn, 32767, _T( ".\\Set.ini" ) );
for( int iLoop = 0; iLoop < dwSize - 1; iLoop++ )
{
	if( _T( '\0' ) == tzReturn[iLoop] )
		tzReturn[iLoop] = _T( '\n' );
}

if( 0 != dwSize )
{
	CString sRead;
	sRead.Format( _T( "%s" ), tzReturn );
	int iLine = 0;
	CString sLine;
	while( ::AfxExtractSubString( sLine, sRead, iLine++, _T( '\n' ) ) )
	{
		int iTab = 0;
		CString sTab;
		int iIndex = 1;
		while( ::AfxExtractSubString( sTab, sLine, iTab++, _T( '\t' ) ) )
		{
			TRACE( _T( "%s\n" ), sTab );
		}
	}
}

상황에 맞춰서 해당되는 함수를 사용하시면 될 것 같습니다.