프로그래밍 강의/게임메이커 스튜디오

GMS, 파일을 읽고 써보자 -2-

wnsrn3436 2013. 8. 26. 18:27

 

두 번째 파일 관리 강좌에서는 바이너리 파일(bin)을 읽고/쓰는 방법을 배웁니다.

저번 강좌에서는 텍스트 파일의 입출력에 대해 공부하였었는데, 지금부터 배우는 바이너리는 직관적으로는 보이지 않는 숫자인지라 많이 난해하실 수도 있습니다.

하지만 배워두면 또 매력적인 게 바로 바이너리 파일의 입출력 부분이지요.

 

 

위 사진처럼 바이너리 파일도 텍스트 파일처럼 일단 파일을 열면 닫아야 하는 것은 똑같습니다.

하지만 위 함수에서 보이듯, 파일을 여는 방식이 다릅니다.

 

바이너리 파일을 여는 함수는 file_bin_open(파일이름, 모드) 와 같은 인자를 가지고 있습니다.

특이한 점은 모드에 따라 파일을 여는 방식이 다르다는 것이죠.

 

모드가 0일 때는 읽기 모드로 파일을 열고, 모드가 1일 때는 쓰기 모드로 파일을 엽니다.

또한, 모드가 2일 때에는 읽기/쓰기 혼합 모드로 파일을 열게 됩니다.

텍스트 파일 함수와 많이 다른 것을 보실 수가 있습니다.

 

 

위 코드는 source.txt 파일을 dest.txt 파일로 복사하는 코드입니다. (file_copy 함수 구현)

파일을 복사하기 위해서 하나는 읽기 모드로, 하나는 쓰기 모드로 파일을 열고 진행하는 것을 보실 수 있습니다.

일단 file_bin_size 함수로 소스 파일의 크기를 얻어내서, file_bin_read_byte 함수로 소스 파일의 일 바이트를 읽은 뒤 file_bin_write_byte 함수로 대상 파일에 기입하는 방식입니다.

 

중요한 사실은 현재 겜스에서는(추후에 바뀔지도 모르지만) 파일을 1 바이트로 읽는 것만을 지원합니다.

short, int, double 같은 1 바이트가 넘는 자료형은 지원하지 않습니다만, 저런 자료형은 사실 직접 구현할 수도 있습니다.

이 부분은 이따가 다루도록 하고요.

 

위 코드를 이해하셨으면 어느 정도 함수를 이해하신 겁니다.

이제 실질적인 부분을 들어가 봅시다.

 

 

위와 같이 바이트를 기입했다고 가정했을때, 실제 파일은 어떤 식으로 저장될까요?

참고로 겜스의 byte 자료형은 unsigned 자료형을 사용하므로, 범위가 0~255 까지입니다.

 

 

보이시나요?

헥스 에디터로 열어보니 16진수로 40, 80, FF 로서 정확히 작성된 것을 보실 수 있습니다.

바로 이런 방법으로 한 바이트 한 바이트를 기입해나가는 것입니다.

 

그런데 이렇게 해버리면 실질적으로는 0~255 까지의 숫자밖에 저장하지 못합니다!

short, int, double 같은 큰 숫자를 저장하는 자료형은 어떻게 구현해야 하죠?

 

 

위와 같이 큰 숫자의 저장은 비트 연산자로 쉽게 구현됩니다.

위 사진은 int 형 숫자를 저장하는 모습인데요, 비트 쉬프트로 이렇게 저렇게 저장하는 게 보이시나요?

또한, 위 코드처럼 여러 곳에서 쓰이는 코드는 스크립트로 짜시는 게 효과적일 것입니다.

 

http://cafe.naver.com/playgm

Comments