예를들어 어떤 게임 프로그램에서 상위 10등 이내에 든 사람의 이름을 ini 파일에 기록한다면 이런 식이 될 것이다.
[SCORE] | <--- 섹 션: SCORE |
1등=밤사람 | <--- 키: 1등, 값: 밤사람 |
2등=홍길동 | <--- 키: 2등, 값: 홍길동 |
3등=나삼등 | <--- 키: 3등, 값: 나삼등 |
... | ... |
DWORD GetProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize );크게 2가지로 분류해 볼 수 있을 것이다. 하나는 데이터 타입으로 구분된다는 점이고 또 하나는 private이냐 아니냐 하는 점이다.
UINT GetProfileInt( LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault );
DWORD GetPrivateProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName );
UINT GetPrivateProfileInt( LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault, LPCTSTR lpFileName );
GetProfileString()과 GetProfileInt()는 win.ini 파일에, GetPrivateProfileString()과 GetPrivateProfileInt()은 프로그래머가 정의한 ini 파일에 정보를 읽고 쓴다. 함수들의 인자를 자세히 살펴보면 바로 파일명을 전달하는 인자가 있고 없는 차이뿐이다.
API 라이브러리나 DevStudio의 온라인 도움말을 참조하면 함수들의 인자에 대한 자세한 설명이 나와있다. 여기서는 앞에서 예로 들었던 게임점수 기록을 가지고 간단히 설명하겠다.
strName = GetPrivateProfileString( "SCORE", "1등", "기록없음", "c:\\game\\score.ini" );
이것은 "c:\game\score.ini" 파일을 열고 "SCORE" 섹션중 "1등" 이라는 키에 기록되어 있는 값을 읽어 strName 이라는 변수에 저장하라는 말이다. GET 함수들은 읽어낸 값(문자열의 경우 null종료문자를 뺀) 반환한다. 만일 해당 파일이나 섹션, 키가 존재하지 않거나 기록된 값이 없다면 기본값으로 "기록없음"을 사용하라는 뜻이다.
추가로 파일명에 경로가 사용되지 않으면 프로그램은 해당 파일을 윈도우즈 디렉토리에서 찾게 된다. 물론 경로가 쓰인다면 해당 경로에서 파일을 찾게된다.
nScore = GetPrivateProfileInt( "SCORE", "1등점수", 0, "score.ini" );
이것은 읽어내야할 값이 정수라는 차이 밖에 없다. 나머지는 string을 대상으로한 함수와 동일하다.
strName = GetProfileString( "SCORE", "1등", "기록없음" ); nScore = GetProfileInt( "SCORE", "1등점수", 0 );
여기엔 파일명이 없다. 작업 대상이 되는 파일이 무조건 win.ini가 되기 때문이다. 대개는 윈도우즈가 설정한 값들을 이용하기 위해 사용하지만 여러분이 원한다면 개인적인 정보도 win.ini에 두고 사용할 수 있다.
BOOL WritePrivateProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName );
BOOL WriteProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString );
읽기함수들과 달리 쓰는 함수엔 정수형을 위한 함수가 없다. 모두 문자로 처리되기 때문이고 어차피 읽기함수가 그것을 문자로 읽을 것인지 아니면 숫자로 읽을 것인지를 처리해 주므로 아무 문제가 없다.
WritePrivateProfileString( "SCORE", "1등", strName, "c:\\game\\score.ini" ); WritePrivateProfileString( "SCORE", "1등점수", strScore, "c:\\game\\score.ini" );
이것은 "c:\game\score.ini" 파일을 열고 "SCORE" 섹션중 "1등" 키에는 "strName" 변수에 저장된 값을, "1등점수" 키엔 "strScore" 변수에 저장된 값을 기록하라는 뜻이다. 물론 숫자형태의 점수는 문자열로 먼저 변환시켜야 할 것이다. 여기서도 nScore를 strScore로 변형했다.
win.ini를 대상으로한 함수는 설명하지 않아도 되겠죠?
API가 완벽하다고는 할 수 없지만 대개는 제공하지 않는 함수가 있다면 분명히 다른 방법이 있기 때문이다. 이 경우에도 처음부터 숫자 데이터를 읽지말고 문자열로 읽어낸 후에 원하는 변수형으로 전환시키면 된다. 그럼 문자를 숫자로 어떻게...? 게으르기는! C 또는 C++의 문자열처리 함수(또는 클래스)를 찾아보~아.
값을 기록하는 함수들을 그냥 사용하면 된다. 쓰기 함수들은 기록하려는 섹션이나 키가 없다면 새로 만들어서 값을 기록하기 때문이다.
특별히 섹션을 지우는 함수는 없다. 그러나 방법은 있다. 기록함수에서 키네임을 전달하는 두번째 인자의 값으로 null을 주면 된다. 이렇게...
WritePrivateProfileString( "SCORE", NULL, "", "score.ini" );
INI 파일의 모든 섹션을 순서대로 정리하고 싶다면 기록하기 전에 이 방법으로 지우고 나서 기록을 하면 될 것이다.
섞어써도 상관없다. 즉, 대소문자를 구분하지 않는다.
***************************************************************************************
private과 아닌 함수의 차이는 win.ini에는 private가 없는걸 쓰고 자기가 짠프로그램에는 있는걸
쓰면 된다고 DevStudio에 나와 있단다..
***************************************************************************************
|
'프로그래밍 > C++' 카테고리의 다른 글
MFC 주요 클래스의 멤버 변수와 멤버 함수 (0) | 2010.01.22 |
---|---|
MFC Active X 컨트롤 제작 (0) | 2010.01.19 |
[펌]디버깅 숫자들의 의미 (0) | 2009.12.29 |
CPU 사용률 구하기 (How to get CPU usage by performance counters) (0) | 2009.12.28 |
[Tip][VS6.0] 컴파일러를 동시에 여러 개 실행하려면? (0) | 2009.12.16 |
댓글