[Winapi] ini file

spring·2020년 11월 9일
0

1. Write

Write 함수에는 3가지가 있다.

WritePrivateProfileSection[A/W]
WritePrivateProfileString[A/W]
WritePrivateProfileStruct[A/W]
BOOL WritePrivateProfileSectionA(
    LPCSTR lpAppName,  //section 이름
    LPCSTR lpString,   //value
    LPCSTR lpFileName  //파일명
    );

WritePrivateProfileSection 함수는 sectionvalue만 추가하는 방식으로 중복해서 사용할 경우 계속 값이 추가된다. 주의할점은 기존의 key=value 형식의 값이 section에 있었으면 그 값을 모두 지운다.

또한 ini파일 관련 함수는 파일명인자에 반드시 상대경로 .\\을 앞에 지정해줘야 한다.

BOOL WritePrivateProfileStringA(
    LPCSTR lpAppName,   //section 이름
    LPCSTR lpKeyName,   //key 이름
    LPCSTR lpString,    //value
    LPCSTR lpFileName   //파일명
    );

WritePrivateProfileString 함수는 sectionkeyvalue 를 추가한다.
이 함수는 해당 section에 value only가 있어도 무시하고 key=value 형식을 추가한다.
lpKeyName 인수가 NULL 이면 해당 섹션을 모두 지운다.(섹션자체를 지운다)

WritePrivateProfileStruct 는 구조체를 쓰는 함수인데 잘 쓰지 않아서 설명은 패스.

example
int main() {
	WritePrivateProfileSectionA("section1", "value only", ".\\test.ini");
	WritePrivateProfileSectionA("section1", "value only", ".\\test.ini");

	for (int i = 0; i < 3; i++) {
		char key[64], value[64];
		sprintf(key, "%d", i);
		sprintf(value, "%d", i*i);
		WritePrivateProfileStringA("section2", key,value, ".\\test.ini");
	}
}
test.ini
[section1]
value only
value only
[section2]
0=0
1=1
2=4

2. Read

읽기 함수는 아래와 같은 종류들이 있다.

GetPrivateProfileInt[A/W]
GetPrivateProfileString[A/W]
GetPrivateProfileStruct[A/W]
UINT GetPrivateProfileIntA(
    LPCSTR lpAppName,   //section 이름
    LPCSTR lpKeyName,   //key 이름
    INT nDefault,       //읽기에 실패 했을 때, 저장할 기본 값
   LPCSTR lpFileName   //파일명
    );
DWORD GetPrivateProfileStringA(
    LPCSTR lpAppName,        //section 이름
    LPCSTR lpKeyName,        //key 이름
    LPCSTR lpDefault,        //읽기에 실패 했을 때, 저장할 기본 값
    LPSTR lpReturnedString,  //결과 문자열
    DWORD nSize,             //문자열의 길이
    LPCSTR lpFileName        //파일명
    );

GetPrivateProfileStruct 는 마찬가지로 패스.
값을 읽어오는 위 3가지 함수는 사용함에 어려움이 없다.

GetPrivateProfileSectionNames 는 모든 section을 읽어오는 함수이고,
GetPrivateProfileSection 는 해당 section의 모든 값(키 포함)을 읽어 오는 함수이다.

두 함수 모드 결과 string에는 다수의 값이 들어가는데, 구분자는 \0 을 사용하고 마지막에는 널문자가 2개 들어간다. 아래의 예시 코드를 통해 값을 가져오는걸 볼 수 있다.

UINT value = GetPrivateProfileIntA("section2", "2", 0, ".\\test.ini");
std::cout << value << std::endl;

char buffer[256];
GetPrivateProfileStringA("section2", "3", "unknown", buffer, 256, ".\\test.ini");
std::cout << buffer << std::endl;

GetPrivateProfileSectionNamesA(buffer, 256, ".\\test.ini");
for (char* p = buffer; *p != NULL; p += strlen(p) + 1) {
    std::cout << p << std::endl;
}

GetPrivateProfileSectionA("section2", buffer, 256, ".\\test.ini");
for (char* p = buffer; *p != NULL; p += strlen(p)+1) {
    std::cout << p << std::endl;
}

References

https://stackoverflow.com/questions/22138959/c-getprivateprofilestring-read-ini-file-from-current-directory

https://en.wikipedia.org/wiki/INI_file

profile
Researcher & Developer @ NAVER Corp | Designer @ HONGIK Univ.

0개의 댓글