반응형

안녕하세요 단편으로는 처음 쓰는 것 같습니다.

이 단락으로는 조금 어색할 지도 모르겠지만 윈도우 에서 지원하는 INI 파일의 입출력 입니다.

그래서 API 의 메뉴에 쓰게 됩니다.

게임이나 기타 유틸등을 만들때 상당히 파일 입출력에 대해 고민을 하게 됩니다.

그래서 이번에 이렇게 글을 올리게 됩니다.

아직 모르시는 분이 있을지? 도 몰라서 ^^;

여기에서 쓰이는 함수에는 여러가지가 있습니다.

그 중에서도 가장 많이 쓰이는 Int 형과 String 형에 대해 알아보겠습니다.

struct 와 Section 이 있지만 Section 은 거의 쓰이지 않는 편 이고 Struct 와 같은 경우는 바이너리로 쓰는게 더 편하기 때문에^^; 생략합니다.

미리 알아 두어야 할 점은 쓰기에는 STRING 으로 INT 를 그냥 쓸수 있어서 INT 형을 쓰는 함수는 없습니다.

그리고 INI 파일에 쓰이는 형식이 있습니다.

[TITLE] //단락의 시작

NAME = JAEJIN //변수 = 값

이런 식 으로 되어 있습니다. 단락의 시작으로 부터 그 아래의 값들을 찾는 형식으로 되어 있습니다. 단락은 대 괄호로 나타내구요^^

첫번째로 쓰기에 쓰이는 함수는

WritePrivateProfileString 입니다.

WINBASEAPI
BOOL
WINAPI
WritePrivateProfileStringA(
IN LPCSTR lpAppName,
IN LPCSTR lpKeyName,
IN LPCSTR lpString,
IN LPCSTR lpFileName
);

선언에는 이렇게 되어 잇습니다.

lpAppName 에는 단락의 시작 의 이름이 들어 갈 것이고,

lpKeyName 은 변수가 들어 갑니다.

lpString 은 값이 들어 갈 것이고

lpFileName 에는 파일의 경로와 이름이 들어갑니다.

#include <windows.h>


int _tmain(int argc, _TCHAR* argv[])
{
::WritePrivateProfileString( "TITLE", "STRING_KEY", "NAME", "./TEST.INI" );
::WritePrivateProfileString( "TITLE", "NUMBER_KEY", "1024", "./TEST.INI" );
}

자 이렇게 쓴다면 INI 파일에는

[TITLE]
STRING_KEY=NAME
NUMBER_KEY=1024

이렇게 기록이 될 것 입니다.

눈으로 보이기 때문에 상당히 편안한 점이 있습니다.

자 그다음은 읽기 차례 입니다. 위에서는 String 으로 썼지만 NUMBER_KEY 는 INT 형 입니다.

그래서 타입 캐스팅을 하지 않기 위해 INT 형을 읽는 함수가 제공이 됩니다.

여기서 제공 되는 함수는

GetPrivateProfileString

GetPrivateProfileInt

2가지 입니다.

WINBASEAPI
DWORD
WINAPI
GetPrivateProfileStringA(
IN LPCSTR lpAppName,
IN LPCSTR lpKeyName,
IN LPCSTR lpDefault,
OUT LPSTR lpReturnedString,
IN DWORD nSize,
IN LPCSTR lpFileName
);

일단 String 의 원형은 이렇게 됩니다.

lpAppName 은 단락의 시작을 쓰시면 됩니다.

lpKeyName 은 변수가 될 것 이고,

lpDefault 는 만약 저 변수가 없다면 기본으로 읽을 대체문자열을 나타냅니다.

lpReturnString 은 값을 받을 버퍼를 나타내고,

nSize 는 버퍼의 사이즈를 입력 하면 됩니다.

lpFileName 은 파일을 읽을 경로와 이름을 쓰시면 됩니다.

WINBASEAPI
UINT
WINAPI
GetPrivateProfileIntA(
IN LPCSTR lpAppName,
IN LPCSTR lpKeyName,
IN INT nDefault,
IN LPCSTR lpFileName
);

Int 의 원형 입니다.

lpAppName 은 단락의 시작을 쓰시면 되고

lpKeyName 은 변수입니다.

nDefault 는 값을 못찾으면 대체로 쓸 숫자를 적고,

lpFileName 은 파일의 경로와 이름을 쓰시면 됩니다.

#include <windows.h>


int _tmain(int argc, _TCHAR* argv[])
{

char szBuffer[ 256 ] = {0, };
::GetPrivateProfileString( "TITLE", "STRING_KEY", "Unknown", szBuffer, 256, "./TEST.INI" );
int iResult = ::GetPrivateProfileInt( "TITLE", "NUMBER_KEY", 0, "./TEST.INI" );

}

아까 썼던 것을 다시 읽는 소스 입니다.

아까 TITLE 이란 단락으로 STRING_KEY 에 NAME 이란 값을 입력 했습니다. 만약 이 단락을 찾지 못하면 Unknown 이라는 STRING 이

szBuffer 에 찰 것이고, 찾았다면 NAME 이라는 값이 Buffer 에 들어옵니다.

아래 것도 마찬가지로 TITLE 이라는 단락으로 NUMBER_KEY 에 1024 를 썼습니다. 찾지 못하면 0 이 리턴되고 찾았다면 1024가 리턴 될 것 입니다.

소스도 첨부 하겠습니다.

이제는 txt 로 노가다 뛰시는 분들은 텍스트 노가다를 줄여 주시고. 텍스트는 그리고 위험하게 버퍼가 어긋나면

바로 뻑이 납니다.

그래서 저는 이걸 자주 씁니다^^

주의 할 점은 마지막 인자에 FileName 을 쓰는데 앞에 ./ 를 꼭 붇여서 CurrentFolder 라고 명시를 하셔야 합니다.

하지 않으면 못 읽습니다.

또 유용한 점이 있다면 게임을 만드는 개발자 입니다.

유저의 해상도를 파일에 기록하여 런처를 만든다고 합시다. 그러면 int 형으로 기본 1024 로 기록을 하였다 한다면,

유저가 이걸 1280 으로 바꾸었습니다. 하지만 Read 시에 해상도의 단락을 찾지 못하면,

여기에 있는 Default 로 1024로 마춰 줄 수도 있습니다.

짧은 내용이고 대부분 많은 분들이 아는 내용이지만. 혹여나 해서 올려봅니다^^


반응형

'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글

함수포인터  (0) 2012.10.31
GetAsyncKeyState  (0) 2012.10.31
forceinline VS inline  (0) 2012.10.31
보다 더 완성도 있는 프로그램을 위한 assert(0) 함수  (0) 2012.10.31
enum with namespace  (0) 2012.10.31

+ Recent posts