조금이나마 만든 인공지능.
원충돌..
'Windows API 간단한게임' 카테고리의 다른 글
2d슈팅게임 (0) | 2016.04.23 |
---|---|
벽돌깨기 (2) | 2016.04.23 |
슈팅게임 (2) | 2016.03.30 |
카드퍼즐게임 (0) | 2016.03.17 |
카드 짝맞추기 게임 (0) | 2016.03.16 |
조금이나마 만든 인공지능.
원충돌..
2d슈팅게임 (0) | 2016.04.23 |
---|---|
벽돌깨기 (2) | 2016.04.23 |
슈팅게임 (2) | 2016.03.30 |
카드퍼즐게임 (0) | 2016.03.17 |
카드 짝맞추기 게임 (0) | 2016.03.16 |
출처 http://raisonde.tistory.com/9
처음부터 끝까지 읽으면 사용할 수 있다. 천천히 읽어 보길..
기본적인 파일 입출력을 위해선 4개의 함수를 사용한다.
CreateFile, WriteFile, ReadFile, CloseHandle
기본적인 개념부터 설명 하자면, CreateFile은 언뜻 보기엔 파일을 만들기만 할것 같이 생겼지만 그게 아니다.
쉽게 말하면 파일 핸들을 할당하는 함수이다.
WriteFile로 파일에 특정 값을 쓰거나
ReadFile로 파일의 값을 읽어 올때 모두 파일 핸들을 이용한다. "abc.txt"같은 특정 파일에 다이렉트로 접근 할 수 없는 것이다.
이런식으로 특정 파일에 접근할 수 있는 핸들 할당을 위한 함수가 CreateFile이다.
이런식으로 파일을 새로 만들거나 기존 파일을 열어서 fileHandle에 할당하고
파일에 값을 쓰거나 어떤 주소로 파일의 값을 읽는다. 그리고
핸들을 닫아준다.
딱 사용 할 수 있을 정도로만 설명 할 것이다.
CreateFile
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile );
lpFileName 은 말그래도 파일 명이다. LTPSTR형의 변수를 입력 해 주거나 _T("Filename.file")과 같이 직접 적어준다.
이중에서 이해 할 수 없는 부분은 딱 한군데. SetFilePointerEx 일 것이다.
파일 핸들은 파일을 컨트롤 하기 위해 항상 포인터 정보를 가지고 있다. 파일을 읽을때 항상 처음부터 끝까지 읽는게 아니라 원하는 어느 부분부터 어느 부분까지도 읽을 수 있어야 하기 때문이다. 쓸 때도 마찬가지다. 항상 끝에서 쓰는게 아니라, 중간에 끼워서 써야 될 수도 있고 제일 첫부분에 추가시켜야 되는 내용도 있을 수 있다.
그러므로 파일 포인터을 이동시켜 가며 파일을 제어 하는데, 글을 입력할때 깜박거리는 커서로 이해 하면 쉬울 것이다.
글을 다 쓰고 나면 이 커서는 항상 제일 끝에 있다. 그래야 다음에 추가로 쓸게 있더라도 편하게 쓰기만 하면 알아서 이어 지는 것이다.
하지만 우리가 원하는 것은 파일의 처음부터 읽는 것이므로 그 포인터를 제일 앞으로 옮겨 줘야 한다. 이런식으로 포인터를 인위적으로 조작 할때 SetFilePointerEx를 쓴다. (SetFilePointer 함수를 확상시킨 함수이지만, SetFilePointer함수는 옛날에 만들어진 함수로 4G이상의 파일을 컨트롤 할 수 없기 때문에 요즘은 거의 쓰이지 않는다.)
BOOL WINAPI SetFilePointerEx(
HANDLE hFile,
LARGE_INTEGER liDistanceToMove,
PLARGE_INTEGER lpNewFilePointer,
DWORD dwMoveMethod
);
앞의 글을 차근차근 읽었다면 이 인자를 어렵지 않게 이해 할 수 있을 것이다.
hFile 은 포인트를 조정 할 파일 핸들,
liDistanceToMove 는 얼마나 이동 할 것인가
lpNewFilePointer 옮겨진 포인터를 확인 할 수 있다. 굳이 확인 할 필요가 없을 경우엔 NULL
dwMoveMethod 어디서 이동 할 것인가 플래그들은 다음과 같다.
FILE_BEGIN : 파일의 처음부터
FILE_END : 파일을 끝에서
FILE_CURRENT : 현재 위치에서
더 성명할 필요 없을거라 믿는다.
단, 중요한건 여기서는 LARGE_INTEGER를 사용 한다는 것인데, 이는 큰 용량의 파일을 컨트롤 하기 위해 쓰이는 파일 형이다.
Windows.h에서 이미 정의되어 있는 공용체(UNION)인데, 일반적으로는 QuadPart만 사용하면 일반 DWORD처럼 사용 가능하다. 자세한건 여기서 다루지 않겠다.
LARGE_INTEGER curPtr; //Windows.h에서 이미 정의되어 있으므로 그냥 사용
curPtr.QuadPart = 10 //이렇게 그냥 DWORD처럼 사용 할 수 있다.
아래 소스를 돌려 보고 위 소스와의 차이, 결과값을 보면 이해하기 쉬울 것이다.
(펌) wcs _tcs 비교 (0) | 2016.03.01 |
---|---|
문자열코딩, 유니코드 멀티바이트에관해 잘 정리해놓은 블로그 주소입니다. (0) | 2016.03.01 |
함수는 timeGetTime() 이구요, 밀리세컨드(ms)단위로 측정가능합니다.
방법은 아주 간단합니다.
DWORD dwStartTime = timeGetTime();
// 처리부분
...
// 처리부분 종료
DWORD dwEndTime = timeGetTime();
printf("%d ms", dwEndTime-dwStartTime);
필요한 부분에 추가하시고 쓰면 됩니다.
단, 사용하기 위해서는 사용하는 파일에 Mmsystem.h 를 Include 해주고,winmm.lib 를 Project=>Setting(ALT+F7) 메뉴의 LINK 텝에서 Object/library modules: 에 추가를 해주어야 합니다..
함수포인터 활용 (0) | 2016.09.01 |
---|---|
c++ 파일 입출력 (텍스트 파일을 읽어서 원하는 정보 얻어오기) (1) | 2016.08.11 |
벡터 clear (0) | 2016.07.13 |
벡터에서 erase사용시 주의할것. (0) | 2016.03.30 |
첫글 (0) | 2016.02.22 |