파일 입출력

김태훈·2024년 1월 12일
0

Win32API

목록 보기
21/24
post-custom-banner

개념

저장장치에 있는 데이터들을
RAM에 올려놓고 이것을 우리가 보는것

저장장치에 저장 하지 않으면 RAM에 있던것들은 다 날라간다

scene에서 타일로딩

scene tool에서 저장(tile을 관리하고 작업하는 곳)

확장자가 다르다 해도 파일 구성이 달라지는 것은 아님
그냥 어떤 류의 파일이다라는 것을 알려주는 것

확장자
하지만 뷰어 프로그램이 실제는 동영상인데
확장자를 봣을때 이미지니까
이미지로 파일열면 오류가 발생

그래서 파일과 확장자를 매칭 해줘야 한다

타일은 내 프로그램에서만 사용 하는 것이기 때문에 따로 tile로확장자를 만들어 줬다

이중 포인터
수정할 대상이 포인터라서
포인터를 수정하기 위해 포인터의 포인터를 필요로 한다
이러한 개념을 똑같이 확장해서 삼중,사중 포인터까지 확장 할수 있다

File,stream

stream은 저장장치와 프로그램의 연결을 뜻한다
File은 stream을 잡아주는 것
wfopen_s는 이 연결한 File주소를 반환해 준다
반환된것이 nullptr이면 연결실패

File 열고 하고자 하는 것을 끝냈으면 fclose를 해줘야 한다

File 하나가 스트림하나를 대변 한다고 생각하면 된다

wfopen할때 모드가 있다(읽기전용,쓰기 전용,읽기와 쓰기 둘다 등등 여러개)
그냥 w는 문자데이터로 인식 쓰는것
wb 쓰기모드이긴한데 binary로 쓰는것
숫자를 적었는데 아스키 코드로 인식하면 의도치 않은 상황발생 가능 ,따라서 wb,wr로 사용
읽기도 마찬가지

Savefile

wfopen이 쓰기 모드일 경우 경로에 파일이 없으면 파일을 만들어 버린다
모드에 따라 경로에 파일이 있으면 이어 쓸수 있지만, 보통 덮어 씌어버린다
fwirte를 통해 연결된 스트림에 쓴다

void CScene_Tool::SaveTile(const wstring& _strconstPath)
{
	
	FILE* pFile;
	_wfopen_s(&pFile, _strconstPath.c_str(), L"wb");
	assert(pFile);
	//타일 개수 저장
	UINT iTileXcount = GetTileXCount();
	UINT iTileYcount = GetTileYcount();
	fwrite(&iTileXcount, sizeof(UINT), 1, pFile);
	fwrite(&iTileYcount, sizeof(UINT), 1, pFile);
	//모든 타일들이 개별적으로 저장할 데이터를 로드하게 함
	const vector<CObject*>vecobj = 
    CSceneMgr::GetInst()->Get_pCurScene()->Get_vecpobj(GROUP_TYPE::Tile);
	for (size_t i = 0; i < vecobj.size(); ++i)
	{
			((CTile*)(vecobj[i]))->Save(pFile);
	}
	fclose(pFile);

}

RoadFile

rb모드 사용
읽기는 경로에 파일이 없으면 nullptr 반환,읽기 실패
SaveFile과 마찬가지

void CScene_Tool::LoadTile(const wstring& _strFilePath)
{
	
FILE* pFile;
_wfopen_s(&pFile, _strFilePath.c_str(), L"rb");
UINT iTileXcount = GetTileXCount();
UINT iTileYcount = GetTileYcount();
if (pFile != nullptr)
{	
	//타일 개수 저장
		fread(&iTileXcount, sizeof(UINT), 1, pFile);
	fread(&iTileYcount, sizeof(UINT), 1, pFile);
	CreateTile(iTileXcount, iTileYcount);
}
const vector<CObject*>vecobj = CSceneMgr::GetInst()->Get_pCurScene()->Get_vecpobj(GROUP_TYPE::Tile);
	
for (size_t i = 0; i < vecobj.size(); ++i)
{
	((CTile*)(vecobj[i]))->Load(pFile);
}
	fclose(pFile);

}

각각의 타일들이 저장할 데이터들이 순서대로 저장 했으니까
로드 할때도 각각의 타일들이 저장한 것들을 순서대로 로드 할수 있다

Save Tile data

저장 위치 경로를 지정하는 윈도우가 이미 있다
윈도우에 사용 되는 구조체 ofn을 채워 넣어야함
ofn.lpstrFilter=L"ALL\0.\0tile\0.tile\0";
확장자 필터, 확장자 all을 택하면 파일명 뒤에 아무것도 안붙고,
확장자 tile을 택하면 파일명 뒤에 .tile이 붙게 한다
strTitleFolder += L"title";
ofn.lpstrInitialDir = strTitleFolder.c_str();//원하는 초기 경로를 const char
로 변경하여 넣어준다

modal 방식의 윈도우 창 하나 생성
if (GetSaveFileName(&ofn))
{
SaveTile(szName);
}

Lode Tile data

로드 될 주소를 선택하는 윈도우에 저장한 주소를
상대 주소만 짤라서 lodeTile에게 줘야한다
그 이유는 그 윈도우에 저장할때 절대 주소 와
LODE Tile 할때의 절대 주소가 다를수 있기 때문

	if (GetOpenFileName(&ofn))
	{
		wstring strFilePath = CPathMgr::GetInst()->GetContentPath();
		wstring strRelativePath = CPathMgr::GetInst()->GetReativePath(szName);
		strFilePath += strRelativePath;
		LoadTile(strFilePath);
	}

profile
복습을 위한 핵심 내용 및 모작
post-custom-banner

0개의 댓글