본문 바로가기
개발/C++

[MFC] C++ 파일입출력 CFile/CArchive (직렬화. Serialize)

by 램램이 2021. 8. 26.

MFC 환경에서 파일을  Read, Wirte할 때 사용할 수 있는 방법이 여러개 있는데

그중 CFile과 CArchive이 대표적으로 많이 사용된다.

MFC의 Document나 View환경에선 직렬화 관련 기본코드를 생성 해준다.

이를 이용하면 편하게 데이터를 입출력 할  수 있을 것이다.아래 간단한 예제로 사용법에 대해서 알아보자.

 

CFile

데이터 쓰기

CFile을 선언하고 Open()후에 입력할 데이터를 Write()함수를 통해 기록하고 Close()를 호출해줘야한다.

int a = 100;
int b = 200;


CFile file;
file.Open(_T("Test.txt"), CFile::modeCreate | CFile::modeWrite);
file.Write( a /*입력할 데이터*/, sizeof(int) /*데이터 사이즈*/)
file.Write( b /*입력할 데이터*/, sizeof(int) /*데이터 사이즈*/)
file.Close();

 

데이터 읽기

Open후에 Read()로 데이터를 가져와서 저장하고 마지막에 Close()를 호출 하면된다.

int a,b;
CString str;

CFile file;
file.Open(_T("Test.txt"), CFile::modeRead);
file.Read(a, sizeof(int));
file.Read(b, sizeof(int));
file.Close();

str.Format(_T("%d, %d"), a,b);

CFile은 Open() 후에 Write()나 Read()를 통해 데이터를 입출력 한다.

 

CArchive

이를보다 편하게 하기 위한 방법중 하나가 CArchive를 이용하는 방법이 있다.

CArchive는 기존 CFile에서 사용하던 Read()나 Write() 함수 대신 <<, >> 연산자를 이용하여 직렬화를 진행한다.

 

데이터 읽기와 쓰기

// 데이터 쓰기

int a = 100;
int b = 200;

CFile file;

if(!file.Open(_T("text.txt"), CFile::modeReadWrite | CFile::modeCreate))
	return;
   
CArchive ar(&file,CArchive::store);
ar << a << b;
file.Close();


// 데이터 읽기

CFile file;
if(!file.Open(_T("test.txt"), CFile::modeRead))
	return;
    
int a, b;

CArchive ar(&file, CArchive::load);
ar >> a >> b;
TRACE(_T("%d, %d"), a, b);
file.Close();

 

MFC 응용 프로그램에서는 자동으로 CArchive 객체를 생성해 준다.

사용자는 Serialize()를 재정의 하여 데이터를 저장할건지 읽어올건지 지정해주면 된다.

void CMFCSerializeTest::Serialize(CArchive& ar)
{
	if(ar.IsStoring())
    {
    	// 이곳에서 data input
    	ar << m_data1 << m_data2;
    }
    else
    {
    	// data output
    	ar >> m_data1 >> m_data2;
    }
}

댓글