게임에서 사용하는 파일 입출력의 변화

binary → xml → json


binary는 이진 형태로 저장하는 방식.

읽고 쓰기가 빠른것은 장점이지만, 사용자가 이해하기가 어렵고 

업데이트시에 문제가 생길 가능성이 있음 (바이트수가 늘어나면서 제대로 안들어간다거)


xml(Extensible Markup Language)은 사용자가 이해하기 쉽게 저장되지만

속도가 느려서 이후 잘 사용하지 않게됨.

PC의 사양이 점차 좋아지면서 큰 문제가 없어지게되었다가 최근 다시 모바일쪽에서 사용하게 됨으로서 속도문제가 발생하게 됨.


json은 그렇게해서 나타난 방식으로 사용자가 이해하기 쉬우면서도 속도를 어느정도 보완한 방식이라고 생각하면 될 듯.

최근에는 거의 다 json을 사용한다고 생각하면 된다.

-----------------------------------------------------------------------------------------------------------------


파일 입력 (C++ 기본 제공 함수를 이용) - 바이너리 형태

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FILE* pFile = NULL;
 
// 파일을 오픈. wt, wb, rt, rb -> w는 write, r은 read / t는 text, b는 binary
fopen_s(&pFile, "a.dat""wb"); 
 
// 파일포인터에 주소가 들어갔다면 - 예외처리
// (즉 주소가 들어가지않았다면 널이므로 실행하지 않겠다는 뜻)
if (pFile != NULL)                
{
    int data = 100;
    // (void*)는 자료형이 뭐가오든 받겠다 비워두겠다는 의미. 
    // 아무거나 넣어도됨, 1은 한번반복
    fwrite((void*)&data, sizeof(int), 1, pFile);        
    fclose(pFile);
}
 
cs


파일 출력 - 바이너리 형태

1
2
3
4
5
6
7
8
9
10
11
12
13
fopen_s(&pFile, "a.dat""rb");
if (pFile)
{
    int data = 0;
    fread_s(&data, sizeof(int), sizeof(int), 1, pFile);
 
    // int값을 출력하기위해 string으로 바꿔주는것
    std::string out = StringUtils::format("%d", data);
 
    // 메세지박스를 이용해서 data값을 확인. 앞은 내용, 뒤는 제목
    MessageBox(out.c_str(), "a.dat");
    fclose(pFile);
}
cs


파일 출력 - cocos2d-x에서 제공하는 Data형을 이용하는 방법

1
2
3
4
5
6
7
8
9
10
Data data;
data = FileUtils::getInstance()->getDataFromFile("a.dat");
 
// 데이터를 바이트단위로 받아옴
unsigned char* pBytes = data.getBytes();
// 받아온 값을 int값에 저장
int nData = (int)*pBytes;
// string으로 변환하여 출력
std::string re = StringUtils::format("%d", nData);
MessageBox(re.c_str(), re.c_str());
cs


Posted by misty_
,