본문 바로가기
프로그래밍/API

API-ini파일

by 리뷰하는 (게임)프로그래머_리프TV 2010. 5. 10.




특정 값이나, 상황, 옵션등을 설정하고 싶을 때, 프로그램 코드에서 설정하거나, 사용자에게 입력받는 방법도 존재 하지만,

모든 상황에 대해서 그 값을 입력받는다거나, 확인하는 작업이 그렇게 편리하지만은 않다.

그래서 존재 하는 것이 ini파일의 활용인데, (확장자만 바꾸면 꼭 ini가 아니여도 상관은 없지만, 보통 확장자를 ini로 많이 사용한다.)

크게 ini파일을 만들면,

세션 과 키값, 그리고 데이터로 분리된다.

[TEST1]
HP=1
MP=2

라는 식을 ini 파일이 가지고 있다고 했을 때

TEST1은 세션
HP, MP는 키값
1과 2는 데이터라고 보면 된다.

크게 어려운 것은 없고.

WritePrivateProfileString 를 사용해 세션을 만들고, 키 값을 만들고, 데이터를 삽입한다.

이 함수는 4개의 인자가 들어가는데, 세션, 키, 데이터, 파일의 (저장될)주소라고 보면 된다.

그리고
GetPrivateProfileString는
세션, 키, 데이터를 추출하지 못하였을때의 기본값, String의 저장 위치, 저장하는 곳의 공간, 파일의 주소
를 인자로 받게 되며 함수명에서 볼 수 있듯이, 파일에서 문자열을 받아 오기 위한 함수이다.

반대로
GetPrivateProfileInt는
세션, 키, 데이터가 저장된 장소, 파일의 주소를 인자라 보내주면
int형 값을 반환한다.

예제를 보면 훨씬 이해가 빠를 것이다.

#include <windows.h>

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("Ini파일");

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpszCmdParam, int nCmdShow )
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst = hInstance;

	WndClass.cbClsExtra = 0;
	WndClass.cbWndExtra = 0;
	WndClass.hbrBackground = (HBRUSH)GetStockObject( COLOR_WINDOW+1 );
	WndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
	WndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
	WndClass.hInstance = hInstance;
	WndClass.lpfnWndProc = WndProc;
	WndClass.lpszClassName = lpszClass;
	WndClass.lpszMenuName = NULL;
	WndClass.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass( &WndClass );

	hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, (HMENU)NULL, hInstance, NULL );
	ShowWindow( hWnd, nCmdShow );

	while( GetMessage( &Message, NULL, 0, 0 ) )
	{
		TranslateMessage( &Message );
		DispatchMessage( &Message );
	}
	return (int)Message.wParam;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
	static int nBuff;
	TCHAR szBuff[80], szBuffer[256];
	switch(iMessage)
	{
	case WM_KEYDOWN:
		switch(wParam)
		{
		case 'A' :
			WritePrivateProfileString(L"TEST", L"STR", L"This is Test",
				L"..\\test123.ini");
			WritePrivateProfileString(L"TEST", L"INT", L"92",
				L"..\\test123.ini");
			WritePrivateProfileString(L"TEST2", L"STR", L"This is Test",
				L"..\\test123.ini");
			WritePrivateProfileString(L"TEST2", L"INT", L"92",
				L"..\\test123.ini");
			WritePrivateProfileString(L"TEST3", L"STR1", L"This iasdfs Test",
				L"..\\test123.ini");
			WritePrivateProfileString(L"TEST3", L"INT1", L"921",
				L"..\\test123.ini");
			WritePrivateProfileString(L"TEST3", L"STR2", L"Thisdfs is Test",
				L"..\\test123.ini");
			WritePrivateProfileString(L"TEST3", L"INT2", L"912",
				L"..\\test123.ini");
			break;
		case 'S' :
			GetPrivateProfileString(L"TEST", L"STR",L"ERROR", szBuff, 80, 
				L"..\\test123.ini");
			nBuff = GetPrivateProfileInt(L"TEST", L"INT", nBuff,
				L"..\\test123.ini");
			wsprintf(szBuffer, L"%s : %d", szBuff, nBuff);
			MessageBox(hWnd, szBuffer, L"", MB_OK);
			break;
		}
		return 0;
	case WM_DESTROY :
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hWnd, iMessage, wParam, lParam);
}​



소스를 실행하면, 경로에 의해 파일이 생성되고,
파일의 내용은

[TEST]
STR=This is Test
INT=92
[TEST2]
STR=This is Test
INT=92
[TEST3]
STR1=This iasdfs Test
INT1=921
STR2=Thisdfs is Test
INT2=912

다음과 같다.

// 실행 화면



A키를 누르고 S키를 누르게 되면 다음처럼 나온다.
만약 A키를 누르지 않고(즉 파일을 생성하지 않고) S키를 누르면

메시지는 ERROR,0 을 출력할 것이다.(단, 한번이라도 생성이 되었다면 파일이 삭제 되지 않는 이상은 옳바른 결과를 출력할 것이다.)

'프로그래밍 > API' 카테고리의 다른 글

API-GetAsyncKeyState( 키보드 입력함수 )  (1) 2010.06.28
API-알파값(비트맵 이미지 투명화)  (0) 2010.05.10
API-애니메이션  (0) 2010.05.10
API-PlaySound  (0) 2010.05.10
API-더블 버퍼링  (0) 2010.05.10