CFile클래스를 이용하면 데이터를 쓰고 읽을수 있다.

그러나 CArchive클래스를 이용 하면 더 쉽게 파일을 열고 읽고 쓸 수 있다..

 

CArchive클래스는 읽기모드(CArchive::load)와 쓰기모드(CArchive::store)로 구분되어 있다.

 

CFile file;

file.Open(TEXT("file.dat"),CFile::modeCreate | CFile::modeWrite);

CArchive ar(&file,CArchive::store);

ar<<data;

 

CFile file;

file.Open(TEXT("file.dat"),CFile::modeRead);

CArchive ar(&file,CArchive::load);

ar>>data;

 

CArchive클래스 이용한 읽고 쓰기

 

데이터를 읽고 쓰기 위해 CArchive클래스는 CFile클래스와 동일한 함수가 있다.(Write(),Read())

Write(),Read()    함수는 CFile과 동일 하다..그리고.>>,<<연산자 를 이용하여 데이터를 읽고 쓰기두 가능 하며 ReadString(), WriteString() 함수를 이용하여 데이터를 텍스트로 읽고 쓸 수 있다.

 

다음과 같이 작성 하면 double형 데이터를 바이너리 형태로 파일에 읽고 쓸수 있다..

 

double pi =3.141592653;

ar.Write(&pi, sizeof(double));

ar.Read(&pi, sizeof(double));

 

이걸 연산자로 표현 하면

 

double pi=3.141592653;

ar<<pi;

ar>>pi;

 

다음과 같이 하면 double형 데이터를 텍스트 형태로 파일에 읽고 쓸 수 있다.

 

double pi =3.141592653;

CString str;

str.Format(TEXT("%f\n"),pi);

ar.WriteString(str);

ar.ReadString(str);

 

바이너리형태로 파일에 저장 될때는 double형의 크기인 8바이트로 저장 되지만

텍스트형으로 저장 될때는 '3', '.', '1', '4', '1', '5','9','2', '6', '5', '3', '\n'

위에 처럼 각각 하나의 문자로 각각 char형 1바이트씩 총... 12바이트를 소비 하게 된다.

 

 

 

<<나 >>연산자로 CArchive에 저장하고 읽어 올수 있는 데이터형

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

                                    저장하고 읽어 올 수 있는 데이터 형식

───────────────────────────────────────────── 

기본 데이터             BYTE, WORD, LONG, DWORD, float, double, int, UINT, short, char

───────────────────────────────────────────── 

MFC클래스              CSize, CPoint, CRect, CString, CTime, CTimeSpan, COleVarient

                             COleCurrencym COleDateTime, COleDateTimeSpan

───────────────────────────────────────────── 

이외의 클래스를 Serialize클래스를 이용해서 저장하고 읽어 올려면

다음과 같은 조건을 충족 해야 한다.

 

1. CObject클래스로부터 직접 또는 간접적으로 상속을 받는다.

2. 생성자를 만들어 준다.

3. 헤더파일에 DECLARE_SERIAL매크로를 적어준다.

4. 소스 파일에 IMPLEMENT_SERIAL 매크로를 적어 준다.

5. Serialize함수를 오버라이딩(재정의)해서 데이터를 저장하는 루틴을 넣어준다.

6. <<,>>연산자를 오버로딩 한다.


#ifdef _DEBUG
#define new DEBUG_NEW
#endif

class CPoint3D : public CObject
{

public:
 DECLARE_SERIAL(CPoint3D);
 int m_x, m_y, m_z;

 CPoint3D();
 CPoint3D(int x, int y, int z);
 void Serialize(CArchive& ar);
};

IMPLEMENT_SERIAL(CPoint3D, CObject, 1);

CPoint3D::CPoint3D( )//생성자.
{
     m_x = m_y = m_z = 0;
}

 

CPoint3D::CPoint3D(int x, int y, int z)
{
     m_x = x; m_y = y; m_z = z;
}

 

void CPoint3D::Serialize(CArchive& ar)
{
      CObject::Serialize(ar);
      if(ar.IsStoring())
       ar << m_x << m_y << m_z;
      else
       ar >> m_x >> m_y >> m_z;
}

CArchive& AFXAPI operator<<(CArchive& ar, CPoint3D& point)
{
      point.Serialize(ar);
      return ar;
}

CArchive& AFXAPI operator>>(CArchive& ar, CPoint3D& point)
{
      point.Serialize(ar);
      return ar;
}

void main()
{
      TRY  // 쓰기
      {
       CPoint3D point(10, 20, 30);
       CFile file;
       file.Open(_T("File.dat"), CFile::modeCreate | CFile::modeWrite);
       CArchive ar(&file, CArchive::store);
  
       ar << point;
      }
      CATCH(CFileException, e)
      {
            e->ReportError();
      }
      END_CATCH

 

      TRY  // 읽기
      {
            CPoint3D point;
            CFile file;
            file.Open(_T("File.dat"), CFile::modeRead);
            CArchive ar(&file, CArchive::load);
  
            ar >> point;
            TRACE("(%d, %d, %d)\n", point.m_x, point.m_y, point.m_z);
      }
      CATCH(CFileException, e)
      {
            e->ReportError();
      }
      END_CATCH
}

 

 

'개발지식창고 > MFC' 카테고리의 다른 글

MFC와 Excel 연동 관련 자료  (0) 2012.06.29
Excel Automation ( 1. 생성 및 변수 초기화 )  (0) 2012.06.29
MFC SDI 객체 간의 접근  (0) 2012.04.14
MDI 구조  (0) 2012.04.05
MFC에서 콘솔창 띄워기 (디버그용도)  (0) 2012.02.05
Posted by 모과이IT
,