Win32API 파일 입출력

Win32API 강의 54화. Win32API 파일 입출력 (1)

https://www.youtube.com/watch?v=j1jpsY4wdSY&list=PL4SIC1d_ab-ZLg4TvAO5R4nqlJTyJXsPK&index=54

 

< 배우게 된 내용 >

실행중인 모든 데이터들이 ram에 저장되어 있음

프로그램이 종료되면 실행중인 데이터들은 모두 사라짐

-> 데이터들을 잃어버리고 싶지 않으면 저장공간에 저장해야함

( Ram과 저장장치 (연결 = File,  바이트 단위로 메모리 전송 ) = 파일 입출력 ) -> _wfopen_s 함수 사용

 

1. ToolScene에서 Tile 정보 저장 

2. Scene에서 Tile 정보를 읽어오는 기능 ( CScene에서 구현 )

 

타일이 저장 될 곳 위치

( 우리 프로그램에서만 사용하는 확장자파일 -> .tile)

 

 

b를 안쓰면 문자로 저장함

-> 27이 아스키코드로 ESC여서 종료되기 때문에 추후 문제가 생겨서 b를 꼭 써주기

 

타일 저장하기 ( Scene_Tool 에서 )

void CScene_Tool::SaveTile(const wstring& _strRelativePath)
{
    wstring strFilePath = CPathMgr::GetInst()->GetContentPath();
    strFilePath += _strRelativePath;

    // 커널 오브젝트
    FILE* pFile = nullptr;
    
    // 이중포인터 wb ( 바이너리로 쓰기, b를 안쓰면 문자로 저장함 )
    _wfopen_s(&pFile, strFilePath.c_str(), L"wb");

    assert(pFile);

    // 데이터 저장
    UINT xCount = GetTileX();
    UINT yCount = GetTileY();

    fwrite(&xCount, sizeof(UINT), 1, pFile);
    fwrite(&yCount, sizeof(UINT), 1, pFile);

    // 모든 타일들을 개별적으로 저장할 데이터를 저장하게 함
    const vector<CObject*>& vecTile = GetGroupObject(GROUP_TYPE::TILE);
    
    for (size_t i = 0; i < vecTile.size(); ++i)
    {
        ((CTile*)vecTile[i])->Save(pFile);
    }
    
    fclose(pFile);
}

 

 

타일 불러오기 ( CScene 에서 )

 

void CScene::LoadTile(const wstring& _strRelativePath)
{
    wstring strFilePath = CPathMgr::GetInst()->GetContentPath();
    strFilePath += _strRelativePath;

    // 커널 오브젝트
    FILE* pFile = nullptr;

    // 파일 읽기
    _wfopen_s(&pFile, strFilePath.c_str(), L"rb");
    assert(pFile);

    // 데이터 저장
    // 타일 가로 세로 갯수 불러오기
    UINT xCount = 0;
    UINT yCount = 0;

    fread(&xCount, sizeof(UINT), 1, pFile);
    fread(&yCount, sizeof(UINT), 1, pFile);

    // 불러온 개수에 맞게 EmptyTile 들 만들어 두기
    CreateTile(xCount, yCount);
    
    // 만들어진 타일 개별로 필요한 정보를 불러오게 함
    const vector<CObject*>& vecTile = GetGroupObject(GROUP_TYPE::TILE);

    for (size_t i = 0; i < vecTile.size(); ++i)
    {
        ((CTile*)vecTile[i])->Load(pFile);
    }

    fclose(pFile);
}

 

 

< 타일이 저장해야할 정보 >

텍스쳐는 하나만 참조하고 있기 때문에 따로 저장할 필요는 없음

-> 해당 이미지에서 몇번째 인덱스를 저장하고 있는지만을 저장하면 됨 

 

void CTile::Save(FILE* _pFile)
{
    fwrite(&m_iImgIdx, sizeof(int), 1, _pFile);
}

void CTile::Load(FILE* _pFile)
{
    fread(&m_iImgIdx, sizeof(int), 1, _pFile);
}

 


Win32API 강의 55화. Win32API 파일 입출력 (2)

https://www.youtube.com/watch?v=X9KROx_5LzY&list=PL4SIC1d_ab-ZLg4TvAO5R4nqlJTyJXsPK&index=55

 

 

< 배우게 된 내용 >

윈도우에서 파일을 저장과 열기 UI를 표시해주는 dialog을 제공

 

 

 

아래창은 OPENFILENAME 구조체를 만들어서 GetSaveFileName 함수에 인자로 넣어주면 됨

아래의 저장 버튼을 눌렀을때 true값을 반환하므로, if문에서 타일을 저장하는 함수를 부르면 됨

 

저장했을때 들어가는 경로값이 lpstrFile에 들어감

즉 저장을 누르면 최종적으로 들어간 경로명이 lpstrFile이 들어가지기 때문에 경로를 알아줬으니

이 경로로 저장되는 함수를 불러오면 됨

창은 UI일 뿐이고 저장하거나 그런 기능은 없고, 경로만 줄 뿐! ( 따로 구현해야함 )

 

 

 

파일을 열때도 똑같음!, 다만 열때는 GetOpenFileName 함수를 사용한다

 

저장할때는 절대경로로, 불러올때는 절대경로를 상대경로로 바꿔서 함수 안에서 절대경로를 붙여서 여는 방식으로 구현

load는 다른 씬에서도 사용하기 때문

 

 

CScene_Tool 에서 LSHIFT(저장), CTRL(불러오기) 지정

 

void CScene_Tool::update()
{
    CScene::update(); // 부모의 기능 호출

    SetTileIdx();

    if (KEY_TAP(KEY::LSHIFT))
    {
        //CUIMgr::GetIns\t()->SetFocusedUI(m_pUI);
        SaveTileData();
    }

    if (KEY_TAP(KEY::CTRL))
    {
        //CUIMgr::GetIns\t()->SetFocusedUI(m_pUI);
        LoadTileData();
    }
}

 

 

윈도우의 dialog을 통해 파일을 저장

 

 

void CScene_Tool::SaveTileData()
{
    wchar_t szName[256] = {};

    OPENFILENAME ofn = {};

    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = CCore::GetInst()->GetMainHwnd();
    // 완성된 경로가 채워질 곳
    ofn.lpstrFile = szName;
    ofn.nMaxFile = sizeof(szName);
    // 아무 이름이나 아무 확장자 여도 됨 ( 이 필터들만 적용되서 골라짐 )
    ofn.lpstrFilter = L"ALL\0*.*\0Tile\0*.tile\0";
    ofn.nFilterIndex = 0;
    ofn.lpstrFileTitle = nullptr;
    ofn.nMaxFileTitle = 0;

    wstring strTileFolder = CPathMgr::GetInst()->GetContentPath(); // 절대경로
    strTileFolder += L"tile";

    ofn.lpstrInitialDir = strTileFolder.c_str();
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

    // 창 열어주는 함수, Modal 방식
    if (GetSaveFileName(&ofn)) // 저장하기를 눌렀을때, true값 반환
    {
        SaveTile(szName);
    }
}

 

 

윈도우의 dialog를 통해서 파일을 열기

 

 

void CScene_Tool::LoadTileData()
{
    wchar_t szName[256] = {};

    OPENFILENAME ofn = {};

    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = CCore::GetInst()->GetMainHwnd();
    // 완성된 경로가 채워질 곳
    ofn.lpstrFile = szName;
    ofn.nMaxFile = sizeof(szName);
    // 아무 이름이나 아무 확장자 여도 됨 ( 이 필터들만 적용되서 골라짐 )
    ofn.lpstrFilter = L"ALL\0*.*\0Tile\0*.tile\0";
    ofn.nFilterIndex = 0;
    ofn.lpstrFileTitle = nullptr;
    ofn.nMaxFileTitle = 0;

    wstring strTileFolder = CPathMgr::GetInst()->GetContentPath(); // 절대경로
    strTileFolder += L"tile";

    ofn.lpstrInitialDir = strTileFolder.c_str();
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

    // 창 열어주는 함수, Modal 방식
    if (GetOpenFileName(&ofn)) // 저장하기를 눌렀을때, true값 반환
    {
        wstring strRelativePath = CPathMgr::GetInst()->GetRelativePath(szName);
        LoadTile(strRelativePath);
    }
}

'Win32API' 카테고리의 다른 글

Win32API 렌더링 최적화  (0) 2025.01.27
Win32API Alpha Blend  (0) 2025.01.27
Win32API UI  (0) 2025.01.25
Win32API Tool  (0) 2025.01.21
Win32API Unity Build  (0) 2025.01.20
  Comments