슬라이드 1

Similar documents
Microsoft PowerPoint - hci2-lecture7.ppt

윈도우 프로그래밍의 개념

<4D F736F F F696E74202D20C1A C0E520B5B5C5A5B8D5C6AE20C6C4C0CF20C0D4C3E2B7C220B9D720B4D9BEE7C7D120BAE420C5ACB7A1BDBA2E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - hci2-lecture10.ppt

Microsoft PowerPoint _파일입출력.ppt

BMP 파일 처리

5장 MFC기반 다지기

그래픽 프로그래밍

<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

Microsoft Word - hci07-final-answer.doc

08장 윈도우에서의 그리기

Visual C++의 개요

K&R2 Reference Manual 번역본

윈도우시스템프로그래밍

Programming hwp

PowerPoint Template

Microsoft Word - hci08-final-answer.doc

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

윈도우시스템프로그래밍

Microsoft PowerPoint - C++ 5 .pptx

윤성우의 열혈 TCP/IP 소켓 프로그래밍

설계란 무엇인가?

<4D F736F F F696E74202D203032C0E520C0AFC6BFB8AEC6BC20C5ACB7A1BDBABFCD20C1FDC7D520C5ACB7A1BDBA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

Programming hwp

4S 1차년도 평가 발표자료

C++ Programming

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

슬라이드 1

윈도우시스템프로그래밍

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

<4D F736F F F696E74202D203039C0E520B4EBC8ADBBF3C0DA205BC8A3C8AF20B8F0B5E55D>

C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - CPP_chap3

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

JAVA PROGRAMMING 실습 08.다형성

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

10 장세균전프로그래밍 10.1 게임룰 (1) 사람과컴퓨터가싸우는 2인용보드게임이다. (2) 사람이먼저움직이고, 컴퓨터가움직인다. (3) 세균을가로및세로방향으로 2칸까지빈칸으로이동시킬수있다. (4) 1칸을이동할경우에는복제가된다. (5) 이동한후주변세균은내편으로바뀐다.

PowerPoint 프레젠테이션

11장 포인터

untitled

PowerPoint Presentation

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint Presentation

API 매뉴얼

쉽게 풀어쓴 C 프로그래밍

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

Microsoft PowerPoint - 04-UDP Programming.ppt

PowerPoint Presentation

슬라이드 1

슬라이드 1

설계란 무엇인가?

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

설계란 무엇인가?

슬라이드 1

Microsoft PowerPoint - ch07 - 포인터 pm0415

歯9장.PDF

untitled

설계란 무엇인가?

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

Microsoft PowerPoint - hci2-lecture3.ppt

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - hci2-lecture3.ppt

02장.배열과 클래스

The Pocket Guide to TCP/IP Sockets: C Version

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

금오공대 컴퓨터공학전공 강의자료

윤성우의 열혈 TCP/IP 소켓 프로그래밊

03_queue

(Microsoft PowerPoint - 11\300\345.ppt [\310\243\310\257 \270\360\265\345])

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

1. 기본형의형변환복습 C/C++ 형변환의종류 자동형변환 ( 묵시적형변환 ) 강제형변환 ( 명시적형변환 ) 기본형의자동형변환의예 1. 배열 to 포인터변환 배열명은해당배열의첫번째원소의 주소로변환됨 int ary[10]; int *pary = ary; 2. 함수 to 포

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

슬라이드 1

歯Lecture2.PDF

chap7.key

Microsoft PowerPoint - chap03-변수와데이터형.pptx

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

adfasdfasfdasfasfadf

Microsoft PowerPoint - hci2-lecture5-messagemap.ppt

1. 상속의기본개념 다음과같은문제를위한클래스설계 자동차 속성 : 색상, 배기량, 현재속도 메서드 : 가속하라, 멈춰라, 시동을켜라 트럭 속성 : 색상, 배기량, 현재속도, 최대중량 메서드 : 가속하라, 멈춰라, 시동을켜라 택시 속성 : 색상, 배기량, 현재속도, 요금,

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - 제11장 포인터

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

슬라이드 1

WISHBONE System-on-Chip Interconnection Architecture for Portable IP Cores

17장 클래스와 메소드

본 강의에 들어가기 전

Slide 1

윈도우시스템프로그래밍

MFC 프로그래밍

Transcription:

13장직렬화 김성영교수 금오공과대학교 컴퓨터공학부

도큐먼트 / 뷰구조 (1) 도큐먼트와뷰 디스크에저장된파일데이터를읽는경우 도큐먼트객체 뷰객체 파일 사용자 읽기 화면표시 2

도큐먼트 / 뷰구조 (2) 도큐먼트와뷰 사용자가데이터를입력하는경우 도큐먼트객체 뷰객체 파일 사용자 저장 입력 3

도큐먼트 / 뷰구조 (3) 도큐먼트와뷰 입력된데이터를디스크파일에저장하는경우 도큐먼트객체 뷰객체 파일 사용자 저장 4

도큐먼트 / 뷰구조 (4) 도큐먼트와뷰클래스의역할 클래스 도큐먼트 뷰 역할데이터를저장하거나읽어들인다. 데이터의변경사항이생기면뷰의화면을갱신한다. 데이터를화면에표시한다. 사용자와의상호작용을담당한다. 5

도큐먼트 / 뷰구조 (5) 도큐먼트 / 뷰구조의장점 서로다른기능을도큐먼트와뷰클래스로분리해서구현하므로개념적으로이해하기쉬움 도큐먼트하나에뷰가여러개존재하는모델을구현하기쉬움 예 ) 비주얼 C++ 편집창 MFC 에서도큐먼트 / 뷰구조를위해제공하는부가서비스이용가능 예 ) 직렬화 6

도큐먼트 / 뷰구조 (6) SDI 와 MDI 다룰수있는문서의개수에따라구분 7

도큐먼트 / 뷰구조 (7) 도큐먼트템플릿 도큐먼트, 프레임윈도우, 뷰클래스정보를유지 필요에따라해당객체를동적으로생성 MFC 클래스계층도 SDI MDI 8

도큐먼트객체에서의파일처리 어느메시지핸들러에서파일을열고닫을것인가! 실습 13.1 도큐먼트클래스는기본적으로다음두함수재정의 BOOL OnNewDocument(); void Serialize(CArchive& ar); // 초기화 // 파일입출력 9

BOOL CMyDoc::OnNewDocument( ) if (!CDocument::OnNewDocument()) return FALSE; AfxMessageBox( "OnNewDocument" ); return TRUE; void CMyDoc::Serialize( CArchive& ar ) if (ar.isstoring()) AfxMessageBox( "Serialize: Storeing" ); else AfxMessageBox( "Serialize: Loading" ); 10

BOOL CMyDoc::OnOpenDocument( LPCTSTR lpszpathname ) if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; AfxMessageBox("OnOpemDocument"); return TRUE; BOOL CMyDoc::OnSaveDocument( LPCTSTR lpszpathname ) AfxMessageBox("OnSaveDocument"); return CDocument::OnSaveDocument(lpszPathName); void CMyDoc::OnCloseDocument() AfxMessageBox("OnCloseDocument"); CDocument::OnCloseDocument(); void CMyDoc::DeleteContents() AfxMessageBox("DeleteContents"); CDocument::DeleteContents(); 11

프로그램실행전메모장에서 Hello 라고입력하고 C:/DATA.TXT 로저장 프로그램실행시프레임윈도우가나오기전에 DeleteContents 와 OnNewDocument 메시지박스출력 ( 파일메뉴에서새파일을클릭해도마찬가지 ) 12

열기를클릭하면파일대화상자가나온다 DATA.TXT 파일을선택하면 DeleteContents, Serialize:Loading, OnOpenDocument 메시지출력 13

저장을클릭하면 OnSaveDocument, Serialize:Storing 메시지박스차례대로출력 다른이름으로저장을클릭하면 OnSaveDocument, Serialize:Storing 메시지박스차례대로출력 프레임윈도우를닫으면 OnCloseDocument 메시지박스출력 14

파일입출력개요 (1) 파일입출력방법 일반파일입출력 CFile ( 파생 ) 클래스 바이너리모드로파일입출력을지원하는 MFC 클래스 Read(), Write() 등의함수이용 직렬화 CArchive 클래스 << 또는 >> 연산자이용 15

파일입출력개요 (2) 데이터읽기 - 일반파일입출력 CFile file; CFileException e; if(!file.open("mytest.dat", CFile::modeRead, &e) ) e.reporterror(); return; double a, b; file.read( &a, sizeof(a) ); file.read( &b, sizeof(b) ); TRACE( "a = %f, b = %f\n", a, b ); 16

파일입출력개요 (3) 데이터쓰기 - 일반파일입출력 CFile file; CFileException e; if(!file.open("mytest.dat", CFile::modeReadWrite CFile::modeCreate, &e) ) e.reporterror(); return double a = 1.23; double b = 4.56; file.write( &a, sizeof(a) ); file.write( &b, sizeof(b) ); 17

파일입출력개요 (4) 데이터읽기 - 직렬화 CFile file; CFileException e; if(!file.open( "mytest.dat", CFile::modeRead, &e) ) e.reporterror(); return; double a, b; CArchive ar( &file, CArchive::load ); ar >> a >> b; TRACE( "a = %f, b = %f\n", a, b ); 18

파일입출력개요 (5) 데이터쓰기 - 직렬화 CFile file; CFileException e; if(!file.open( "mytest.dat", CFile::modeReadWrite CFile::modeCreate, &e) ) e.reporterror(); return; double a = 1.23; double b = 4.56; CArchive ar( &file, CArchive::store ); ar << a << b; 19

직렬화기초 (1) 직렬화원리 CArchive ar(...); ar << a << b; CArchive ar(...); ar >> a >> b; a, b CArchive 객체 CFile 객체 디스크파일 20

직렬화기초 (2) CArchive 클래스생성자 CArchive::CArchive(CFile* pfile, UINT nmode, int nbufsize=4096, void* lpbuf=null); pfile CFile 객체 nmode CArchive::load 또는 CArchive::store nbufsize CArchive 클래스내부에서사용할버퍼크기 lpbuf 사용자정의버퍼의주소 21

직렬화기초 (3) 직렬화가능한데이터타입 구분 기본형 비기본형 데이터타입 BYTE, WORD, LONG, DWORD, float, double, int, short, char, wchar_t, unsigned RECT, POINT, SIZE, CRect, CPoint, CSize, CString, CTime, CTimeSpan, COleVariant, COleCurrency, COleDateTime, COleDataTimeSpan 22

CFile 클래스를이용한입출력 BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszpathname) if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; MYDOC.CPP CFile f; f.open( lpszpathname, CFile::modeRead ); f.read( m_szmsg, 256 ); f.close( ); UpdateAllViews( NULL ); return TRUE; 23

BOOL CMyDoc::OnSaveDocument(LPCTSTR lpszpathname) char szmsg[] = "Hello, Part II"; CFile f; f.open( lpszpathname, CFile::modeWrite CFile::modeCreate ); f.write( szmsg, strlen(szmsg) ); f.close( ); return TRUE; 24

CArchive 클래스를이용한입출력 객체만처리가능 문자배열대신문자열클래스 CString 사용 실제로파일을처리하는주체는 CFile 객체 먼저 CFile 객체준비 BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszpathname) if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; CString strmsg; CFile f; f.open( lpszpathname, CFile::modeRead ); CArchive ar( &f, CArchive::load ); ar >> strmsg; // 문자열객체로읽음 strcpy( m_szmsg, (LPCSTR)strMsg ); // 문자배열에복사 ar.close( ); f.close( ); MYDOC.CPP 25

UpdateAllViews(NULL); return TRUE; BOOL CMyDoc::OnSaveDocument(LPCTSTR lpszpathname) CString strmsg; strmsg = "Hello, Part III"; CFile f; f.open( lpszpathname, CFile::modeWrite CFile::modeCreate ); CArchive ar( &f, CArchive::store ); ar << strmsg; // 문자열객체로저장 ar.close(); f.close(); return TRUE; 프로그램실행결과 26

Serialize() 함수를이용한입출력 인자로넘어오는 CArchive 객체를이용해입출력작업 void CMyDoc::Serialize( CArchive& ar ) CString strmsg; if( ar.isstoring() ) strmsg = "Hello, Part IV"; ar << strmsg; else ar >> strmsg; strcpy( m_szmsg, (LPCSTR)strMsg ); UpdateAllViews( NULL ); MYDOC.CPP 27

프로그램실행결과 Serialize() 함수를사용하여처리될수있는데이터는 Serialize() 가가능한객체이어야함 28

OnopenDocument() 나 Serialize() 함수를사용하는경우드래그앤드롭 (Drag & Drop) 기능사용가능 CMyApp 클래스의 InitInstance() 함수에코드추가 BOOL CMyApp::InitInstance() m_pmainwnd->dragacceptfiles(true); return TRUE; MY.CPP 29

직렬화가능객체 실습 13.3 마우스클릭 원을그림 저장버튼 현재좌표를파일로저장 열기버튼 파일에저장해둔좌표를읽어와원을복원 마우스의좌표를직렬화가능한클래스로구현 직렬화가능한클래스는 CObject 클래스로부터상속받아기본적으로 Serialize() 함수를재정의하여구현 클래스정의와구현부분에직렬화처리를위한매크로추가 DECLARE_SERIAL(class_name ) // 헤더파일에추가 IMPLEMENT_SERIAL(class_name, base_class_name, wschema) // 구현파일에추가 직렬화를구현하려는클래스 기반클래스 버전정보 ( 보통 1) 30

마우수의좌표를저장할수있는 CMyPoint 클래스작성 Serialize() 함수에서는기반클래스의 Serialize() 함수를먼저호출 #ifndef MY_POINT #define MY_POINT MYPOINT.H class CMyPoint: public CObject public: CMyPoint(); ~CMyPoint(); long x; long y; void Serialize(CArchive& ar); DECLARE_SERIAL(CMyPoint) ; #endif 31

#include "stdafx.h" #include "mypoint.h" MYPOINT.CPP IMPLEMENT_SERIAL(CMyPoint, CObject, 1) CMyPoint::CMyPoint() x = 0; y = 0; CMyPoint::~CMyPoint() void CMyPoint::Serialize(CArchive& ar) CObject::Serialize(ar); // 기반클래스의 Serialize() 호출 if (ar.isstoring()) ar << x << y; else ar >> x >> y; 32

도큐먼트와뷰클래스에마우스이벤트와파일입출력처리추가 #include "mypoint.h" class CMyDoc : public CDocument public: CMyPoint m_mypt; // 직렬화가능객체 BOOL CMyDoc::OnNewDocument() if (!CDocument::OnNewDocument()) return FALSE; m_mypt.x = 0; m_mypt.y = 0; return TRUE; MYDOC.H MYDOC.CPP 33

void CMyDoc::Serialize(CArchive& ar) m_mypt.serialize(ar); //m_mypt 객체의파일입출력담당 if (ar.isstoring()) //CMyDoc 객체의자체데이터의저장처리 else //CMyDoc 객체의자체데이터읽기처리 UpdateAllViews(NULL); // 뷰갱신 void CMyView::OnDraw(CDC* pdc) CMyDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); CRect rt; rt.left = pdoc->m_mypt.x - 50; rt.top = pdoc->m_mypt.y - 50; rt.right = pdoc->m_mypt.x + 50; rt.bottom = pdoc->m_mypt.y + 50; pdc->ellipse(rt); MYVIEWCPP 34

void CMyView::OnLButtonDown(UINT nflags, CPoint point) CMyDoc* pdoc=getdocument(); pdoc->m_mypt.x = point.x; // 도큐먼트의멤버변수에마우스좌표기록 pdoc->m_mypt.y = point.y; pdoc->setmodifiedflag(); // 도큐먼트의내용이변경되었음을알림 Invalidate(); CView::OnLButtonDown(nFlags, point); SetModifiedFlag() 는도큐먼트내용변경을알림 도큐먼트내용이저장되지않고파괴되는경우대화상자출력 35

CMyDoc 클래스의 Serialize() 함수수정가능 void CMyDoc::Serialize(CArchive& ar) //m_mypt.serialize(ar); // 주석처리 if (ar.isstoring()) ar << &m_mypt; else CMyPoint* tmp; ar >> tmp; m_mypt.x = tmp->x; //tmp 가참조하고있는것복사 m_mypt.y = tmp->y; //tmp 가참조하고있는것복사 UpdateAllViews(NULL); MYDOC.CPP 36