CFile 16 n try CFile filemytest txt CFile

  • Slides: 54
Download presentation

CFile 클래스 (1/6) n 열기와 생성 try { CFile file("mytest. txt", CFile: : mode.

CFile 클래스 (1/6) n 열기와 생성 try { CFile file("mytest. txt", CFile: : mode. Read. Write); // 방법 1 } catch (CFile. Exception* e){ e->Report. Error(); e->Delete(); } CFile file; CFile. Exception e; if(!file. Open("mytest. txt", CFile: : mode. Read. Write, &e)) // 방법 2 e. Report. Error(); 4

CFile 클래스 (3/6) n 닫기: 방법 1 void CEx. File. View: : On. LButton.

CFile 클래스 (3/6) n 닫기: 방법 1 void CEx. File. View: : On. LButton. Dbl. Clk(UINT n. Flags, CPoint point) { CFile file; CFile. Exception e; if(!file. Open("mytest. txt", CFile: : mode. Read. Write| CFile: : mode. Create, &e)){ e. Report. Error(); return; } // 생략. . . } // -> CFile: : ~CFile() 함수가 호출된다. 6

CFile 클래스 (4/6) n 닫기: 방법 2 void CEx. File. View: : On. LButton.

CFile 클래스 (4/6) n 닫기: 방법 2 void CEx. File. View: : On. LButton. Dbl. Clk(UINT n. Flags, CPoint point) { CFile file; CFile. Exception e; if(!file. Open("mytest. txt", CFile: : mode. Read. Write|CFile: : mode. Create| CFile: : mode. No. Truncate, &e)){ e. Report. Error(); return; } // 생략. . . file. Close(); } 7

CFile 클래스 (5/6) n 읽기와 쓰기 UINT CFile: : Read (void* lp. Buf, UINT

CFile 클래스 (5/6) n 읽기와 쓰기 UINT CFile: : Read (void* lp. Buf, UINT n. Count) ; void CFile: : Write (const void* lp. Buf, UINT n. Count) ; n 파일 포인터 위치 변경 ULONG CFile: : Seek (LONG l. Off, UINT n. From) ; n. From 의미 CFile: : begin 파일의 처음 위치부터 l. Off만큼 파일 포인터 이동 CFile: : current 현재의 파일 포인터 위치부터 l. Off만큼 파일 포인터 이동 CFile: : end 파일의 끝 위치부터 l. Off만큼 파일 포인터 이동 8

CMem. File 클래스 n 사용 예 void CEx. File. View: : On. LButton. Dbl.

CMem. File 클래스 n 사용 예 void CEx. File. View: : On. LButton. Dbl. Clk(UINT n. Flags, CPoint point) { CMem. File file; // 메모리 파일에 쓰기 int a = 100; file. Write(&a, sizeof(a)); } // 메모리 파일에서 읽기 file. Seek. To. Begin(); int b; file. Read(&b, sizeof(b)); TRACE("b = %dn", b); 10

CStdio. File 클래스 (1/2) n 사용 예 void CEx. File. View: : On. LButton.

CStdio. File 클래스 (1/2) n 사용 예 void CEx. File. View: : On. LButton. Dbl. Clk(UINT n. Flags, CPoint point) { CStdio. File file 1; CFile. Exception e; if(!file 1. Open("test 1. txt", CFile: : mode. Read, &e)) { e. Report. Error(); return; } CStdio. File file 2; if(!file 2. Open("test 2. txt", CFile: : mode. Write|CFile: : mode. Create, &e)) 11

CStdio. File 클래스 (2/2) 사용 예 (cont'd) n { } } e. Report. Error();

CStdio. File 클래스 (2/2) 사용 예 (cont'd) n { } } e. Report. Error(); return; CString str; while(file 1. Read. String(str)){ str. Make. Upper(); file 2. Write. String(str + "n"); } 12

CFile. Find 클래스 (2/2) n 사용 예 void CEx. File. View: : On. LButton.

CFile. Find 클래스 (2/2) n 사용 예 void CEx. File. View: : On. LButton. Dbl. Clk(UINT n. Flags, CPoint point) { CFile. Find finder; BOOL b. Working = finder. Find. File("*. *"); while(b. Working){ b. Working = finder. Find. Next. File(); if(finder. Is. Directory()) TRACE("[%s]n", (LPCTSTR)finder. Get. File. Name()); else TRACE("%sn", (LPCTSTR)finder. Get. File. Name()); } } 14

도큐먼트/뷰 구조 (8/9) n Init. Instance() 함수 BOOL CEx. File. App: : Init. Instance()

도큐먼트/뷰 구조 (8/9) n Init. Instance() 함수 BOOL CEx. File. App: : Init. Instance() {. . . CSingle. Doc. Template* p. Doc. Template; p. Doc. Template = new CSingle. Doc. Template( IDR_MAINFRAME, RUNTIME_CLASS(CEx. File. Doc), RUNTIME_CLASS(CMain. Frame), RUNTIME_CLASS(CEx. File. View)); Add. Doc. Template(p. Doc. Template); . . . } 22

도큐먼트/뷰 구조 응용 프로그램 예제 작성 (3/5) n 코드 추가 void CEx. File. View:

도큐먼트/뷰 구조 응용 프로그램 예제 작성 (3/5) n 코드 추가 void CEx. File. View: : On. Draw(CDC* p. DC) { CEx. File. Doc* p. Doc = Get. Document(); ASSERT_VALID(p. Doc); p. DC->Set. Map. Mode(MM_LOMETRIC); p. DC->Ellipse(100, -100, 600, -600); } 26

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (1/10) n 응용 프로그램 클래스 BEGIN_MESSAGE_MAP(CEx. File. App,

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (1/10) n 응용 프로그램 클래스 BEGIN_MESSAGE_MAP(CEx. File. App, CWin. App) //{{AFX_MSG_MAP(CEx. File. App) ON_COMMAND(ID_APP_ABOUT, On. App. About) //}}AFX_MSG_MAP ① ON_COMMAND(ID_FILE_NEW, CWin. App: : On. File. New) ON_COMMAND(ID_FILE_OPEN, CWin. App: : On. File. Open) ON_COMMAND(ID_FILE_PRINT_SETUP, CWin. App: : On. File. Print. Setup) END_MESSAGE_MAP() BOOL CEx. File. App: : Init. Instance() { ② CSingle. Doc. Template* p. Doc. Template; p. Doc. Template = new CSingle. Doc. Template( 29

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (2/10) IDR_MAINFRAME, RUNTIME_CLASS(CEx. File. Doc), RUNTIME_CLASS(CMain. Frame), RUNTIME_CLASS(CEx.

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (2/10) IDR_MAINFRAME, RUNTIME_CLASS(CEx. File. Doc), RUNTIME_CLASS(CMain. Frame), RUNTIME_CLASS(CEx. File. View)); Add. Doc. Template(p. Doc. Template); ③ CCommand. Line. Info cmd. Info; Parse. Command. Line(cmd. Info); ④ if (!Process. Shell. Command(cmd. Info)) return FALSE; ⑤ m_p. Main. Wnd->Show. Window(SW_SHOW); m_p. Main. Wnd->Update. Window(); } return TRUE; 30

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (3/10) n 프레임 윈도우 클래스 // 헤더 파일

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (3/10) n 프레임 윈도우 클래스 // 헤더 파일 class CMain. Frame : public CFrame. Wnd {. . . protected: ① DECLARE_DYNCREATE(CMain. Frame). . . } // 구현 파일 . . . ② IMPLEMENT_DYNCREATE(CMain. Frame, CFrame. Wnd). . . 31

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (4/10) n 뷰 클래스 // 헤더 파일 class

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (4/10) n 뷰 클래스 // 헤더 파일 class CEx. File. View : public CView { protected: CEx. File. View(); ① DECLARE_DYNCREATE(CEx. File. View) public: ② CEx. File. Doc* Get. Document(); . . . } #ifndef _DEBUG ③ inline CEx. File. Doc* CEx. File. View: : Get. Document() { return (CEx. File. Doc*)m_p. Document; } #endif 32

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (5/10) // 구현 파일 ④ IMPLEMENT_DYNCREATE(CEx. File. View,

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (5/10) // 구현 파일 ④ IMPLEMENT_DYNCREATE(CEx. File. View, CView) BEGIN_MESSAGE_MAP(CEx. File. View, CView) //{{AFX_MSG_MAP(CEx. File. View) //}}AFX_MSG_MAP ⑤ ON_COMMAND(ID_FILE_PRINT, CView: : On. File. Print) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView: : On. File. Print) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView: : On. File. Print. Preview) END_MESSAGE_MAP(). . . ⑥ void CEx. File. View: : On. Draw(CDC* p. DC) { CEx. File. Doc* p. Doc = Get. Document(); 33

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (6/10) ASSERT_VALID(p. Doc); p. DC->Set. Map. Mode(MM_LOMETRIC); p.

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (6/10) ASSERT_VALID(p. Doc); p. DC->Set. Map. Mode(MM_LOMETRIC); p. DC->Ellipse(100, -100, 600, -600); }. . . ⑦ CEx. File. Doc* CEx. File. View: : Get. Document() { ASSERT(m_p. Document->Is. Kind. Of(RUNTIME_CLASS(CEx. File. Doc))); return (CEx. File. Doc*)m_p. Document; } 34

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (7/10) n 도큐먼트 클래스 // 헤더 파일 class

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (7/10) n 도큐먼트 클래스 // 헤더 파일 class CEx. File. Doc : public CDocument { protected: CEx. File. Doc(); ① DECLARE_DYNCREATE(CEx. File. Doc) // Class. Wizard generated virtual function overrides //{{AFX_VIRTUAL(CEx. File. Doc) public: ② virtual BOOL On. New. Document(); ③ virtual void Serialize(CArchive& ar); //}}AFX_VIRTUAL 35

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (8/10) public: virtual ~CEx. File. Doc(); #ifdef _DEBUG

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (8/10) public: virtual ~CEx. File. Doc(); #ifdef _DEBUG virtual void Assert. Valid() const; virtual void Dump(CDump. Context& dc) const; #endif }; DECLARE_MESSAGE_MAP() // 구현 파일 ④ IMPLEMENT_DYNCREATE(CEx. File. Doc, CDocument) BEGIN_MESSAGE_MAP(CEx. File. Doc, CDocument) END_MESSAGE_MAP() 36

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (9/10) CEx. File. Doc: : CEx. File. Doc()

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (9/10) CEx. File. Doc: : CEx. File. Doc() { } CEx. File. Doc: : ~CEx. File. Doc() { } ⑤ BOOL CEx. File. Doc: : On. New. Document() { if (!CDocument: : On. New. Document()) return FALSE; } return TRUE; ⑥ void CEx. File. Doc: : Serialize(CArchive& ar) { if (ar. Is. Storing()) { } 37

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (10/10) } else { } #ifdef _DEBUG void

도큐먼트/뷰 구조 응용 프로그램 예제 분석 (10/10) } else { } #ifdef _DEBUG void CEx. File. Doc: : Assert. Valid() const { CDocument: : Assert. Valid(); } void CEx. File. Doc: : Dump(CDump. Context& dc) const { CDocument: : Dump(dc); } #endif //_DEBUG 38

직렬화 기초 (2/8) n 데이터 읽기 - 일반 파일 입출력 CFile file; CFile. Exception

직렬화 기초 (2/8) n 데이터 읽기 - 일반 파일 입출력 CFile file; CFile. Exception e; if(!file. Open("mytest. dat", CFile: : mode. Read. Write| CFile: : mode. Create, &e)) { e. Report. Error(); return } int a = 100; int b = 200; file. Write(&a, sizeof(a)); file. Write(&b, sizeof(b)); 40

직렬화 기초 (3/8) n 데이터 읽기 - 직렬화 CFile file; CFile. Exception e; if(!file.

직렬화 기초 (3/8) n 데이터 읽기 - 직렬화 CFile file; CFile. Exception e; if(!file. Open("mytest. dat", CFile: : mode. Read. Write| CFile: : mode. Create, &e)) { e. Report. Error(); return; } int a = 100; int b = 200; CArchive ar (&file, CArchive: : store); ar << a << b; 41

직렬화 기초 (4/8) n 데이터 쓰기 - 일반 파일 입출력 CFile file; CFile. Exception

직렬화 기초 (4/8) n 데이터 쓰기 - 일반 파일 입출력 CFile file; CFile. Exception e; if(!file. Open("mytest. dat", CFile: : mode. Read, &e)) { e. Report. Error(); return; } int a, b; file. Read(&a, sizeof(a)); file. Read(&b, sizeof(b)); TRACE("a = %d, b = %dn", a, b); 42

직렬화 기초 (5/8) n 데이터 쓰기 - 직렬화 CFile file; CFile. Exception e; if(!file.

직렬화 기초 (5/8) n 데이터 쓰기 - 직렬화 CFile file; CFile. Exception e; if(!file. Open("mytest. dat", CFile: : mode. Read, &e)) { e. Report. Error(); return; } int a, b; CArchive ar (&file, CArchive: : load); ar >> a >> b; TRACE("a = %d, b = %dn", a, b); 43

직렬화 기초 (6/8) n CArchive 클래스 생성자 CArchive: : CArchive (CFile* p. File, UINT

직렬화 기초 (6/8) n CArchive 클래스 생성자 CArchive: : CArchive (CFile* p. File, UINT n. Mode, int n. Buf. Size = 4096, void* lp. Buf = NULL) ; p. File – CFile 객체의 주소 n. Mode – CArchive: : load 또는 CArchive: : store n. Buf. Size – 내부에서 사용할 버퍼 크기 lp. Buf – 사용자 정의 버퍼의 주소 44

직렬화 기초 (7/8) n 직렬화 가능한 데이터 타입 구분 데이터 타입 기본형 BYTE, WORD,

직렬화 기초 (7/8) n 직렬화 가능한 데이터 타입 구분 데이터 타입 기본형 BYTE, WORD, LONG, DWORD, float, double, int, short, char, wchar_t, unsigned, bool, ULONG, LONG 비 기본형 RECT, POINT, SIZE, CRect, CPoint, CSize, CString, CTime. Span, COle. Variant, COle. Currency, COle. Date. Time, COle. Data. Time. Span 45

도큐먼트/뷰 구조와 직렬화 (1/2) n [파일]->[열기. . . ] 메뉴를 선택한 경우 ON_COMMAND(ID_FILE_OPEN, CWin.

도큐먼트/뷰 구조와 직렬화 (1/2) n [파일]->[열기. . . ] 메뉴를 선택한 경우 ON_COMMAND(ID_FILE_OPEN, CWin. App: : On. File. Open) BOOL CDocument: : On. Open. Document(LPCTSTR lpsz. Path. Name) { // CFile 객체 생성. p. File은 CFile 객체의 주소값이다. . CArchive ar(p. File, Archive: : load|CArchive: : b. No. Flush. On. Delete); . . . Serialize(ar). . . } 47

도큐먼트/뷰 구조와 직렬화 (2/2) n [파일]->[저장] 또는 [다른 이름으로 저장. . . ] 메

도큐먼트/뷰 구조와 직렬화 (2/2) n [파일]->[저장] 또는 [다른 이름으로 저장. . . ] 메 뉴를 선택한 경우 ON_COMMAND(ID_FILE_SAVE, On. File. Save) ON_COMMAND(ID_FILE_SAVE_AS, On. File. Save. As) BOOL CDocument: : On. Save. Document(LPCTSTR lpsz. Path. Name) { // CFile 객체 생성. p. File은 CFile 객체의 주소값이다. . CArchive ar(p. File, CArchive: : store|CArchive: : b. No. Flush. On. Delete); . . . Serialize(ar). . . } 48

직렬화 클래스 구현 (1/5) n 사용자 정의 클래스 class CMy. Data { public: CString

직렬화 클래스 구현 (1/5) n 사용자 정의 클래스 class CMy. Data { public: CString m_str; COLORREF m_color; public: CMy. Data(CString &str, COLORREF &color) { m_str = str; m_color = color; } virtual ~CMy. Data(); }; 49

직렬화 클래스 구현 (2/5) n 직렬화 X void CEx. File. Doc: : Serialize(CArchive& ar)

직렬화 클래스 구현 (2/5) n 직렬화 X void CEx. File. Doc: : Serialize(CArchive& ar) { if (ar. Is. Storing()) { ar << m_data; } else { ar >> m_data; } } 50

직렬화 클래스 구현 (3/5) n 사용자 정의 클래스 변경 // 클래스 선언부 class CMy.

직렬화 클래스 구현 (3/5) n 사용자 정의 클래스 변경 // 클래스 선언부 class CMy. Data : public CObject ① { DECLARE_SERIAL(CMy. Data) ② public: CString m_str; COLORREF m_color; public: CMy. Data() { } ③ CMy. Data(CString &str, COLORREF &color) { m_str = str; m_color = color; } virtual ~CMy. Data(); void Serialize(CArchive& ar); ④ }; 51

직렬화 클래스 구현 (4/5) n 사용자 정의 클래스 변경 (cont'd) // 클래스 구현부 CMy.

직렬화 클래스 구현 (4/5) n 사용자 정의 클래스 변경 (cont'd) // 클래스 구현부 CMy. Data: : ~CMy. Data() { } IMPLEMENT_SERIAL(CMy. Data, CObject, 1) ⑤ void CMy. Data: : Serialize (CArchive& ar) ⑥ { CObject: : Serialize(ar); if(ar. Is. Storing()) ar << m_str << m_color; else ar >> m_str >> m_color; } 52

직렬화 클래스 구현 (5/5) n 직렬화 O void CEx. File. Doc: : Serialize(CArchive& ar)

직렬화 클래스 구현 (5/5) n 직렬화 O void CEx. File. Doc: : Serialize(CArchive& ar) { if (ar. Is. Storing()) { m_data. Serialize(ar); } else { m_data. Serialize(ar); } } 53