본문 바로가기

WinAPI/기본 문법

<Window API> 바이너리 파일 Read & Write 관련 함수들

Binary File 이란? 외부에서 읽을 수 없는 파일, 읽는 속도가 굉장히 빠르다.(.txt 비교시), 가공하지 않은 상태 그대로가 저장된다.

 

 

참조 : fileapi.h

FileOpen -> CreateFile() 함수 FileHandle리턴함

HANDLE CreateFile(
    LPCTSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile);

ex)

Read

fileHandle = CreateFile
(
filePath.c_str()
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);

 

Write

fileHandle = CreateFile
(
filePath.c_str()
, GENERIC_WRITE
, 0
, NULL
, openOption // 옵션은 기본값 2U -> CREATE_ALWAYS(항상 새로운 파일을 만든다.)
, FILE_ATTRIBUTE_NORMAL
, NULL
);

 

 

참조 : handleapi.h

FileClose -> CloseHandle()

CloseHandle(
    _In_ _Post_ptr_invalid_ HANDLE hObject
    );

 

참조 : fileapi.h

WriteData -> WriteFile()

WriteFile(
    _In_ HANDLE hFile,
    _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer,
    _In_ DWORD nNumberOfBytesToWrite,
    _Out_opt_ LPDWORD lpNumberOfBytesWritten,
    _Inout_opt_ LPOVERLAPPED lpOverlapped
    );

 

* Tip : 데이터 크기만큼, 데이터 쓰면 된다.

ex) WriteFile(fileHandle, &data, sizeof(float), &size, NULL);

 

참조 : fileapi.h

ReadData -> ReadFile()

 

ex )

* Tip : Write 했던 데이터 순서, 크기만큼, 읽는다.
float temp = 0.0f;
ReadFile(fileHandle, &temp, sizeof(float), &size, NULL);

 

큰 구조체들은 순서대로 하나씩 읽어들여서 처리하자.

D3DXMATRIX FileReader::ReadMatrix()
{
	D3DXMATRIX matrix;
	matrix._11 = Float();	matrix._12 = Float();	matrix._13 = Float();	matrix._14 = Float();
	matrix._21 = Float();	matrix._22 = Float();	matrix._23 = Float();	matrix._24 = Float();
	matrix._31 = Float();	matrix._32 = Float();	matrix._33 = Float();	matrix._34 = Float();
	matrix._41 = Float();	matrix._42 = Float();	matrix._43 = Float();	matrix._44 = Float();

	return matrix;
}

 

 

* 참고

문자열이 들어있지 않은 구조체라면 한번에 읽고쓰는 것이 가능하다.

Byte크기 만큼 읽거나 쓰면 됨

문자열은 고정길이 문자열이 아닌 이상 byte 크기가 가변적이다.

문자열을 고정길이로 사용하거나, 문자열이 구조체에 포함이 안되어있다면 가능하다.

 

void FileWriter::Byte(void * data, UINT dataSize)
{
	WriteFile(fileHandle, data, dataSize, &size, NULL);
}

void FileReader::Byte(void ** data, UINT dataSize)
{
	ReadFile(fileHandle, *data, dataSize, &size, NULL);
}

 

'WinAPI > 기본 문법' 카테고리의 다른 글

유니코드, 멀티바이트 차이점  (1) 2022.09.28
VirtualAlloc() 함수  (0) 2022.02.17