Download presentation
Presentation is loading. Please wait.
1
Chapter7. 도큐먼트와 파일 입출력 이 학 주
2
목차 Cdocument클래스. CEditView와 CRichEditView SDK 파일 입출력 CFile
도큐먼트 클래스에서 파일 입출력 Serialize() 함수 CEditView와 CRichEditView Ceditview CRichEditView SDK 파일 입출력 CFile
3
1. Cdocument클래스 템플릿를 구성하는 4개의 클래스중에서 데이터를 저장하거나 로드하는 클래스.
템플릿를 구성하는데 필수적인 클래스. 프로그램을 작성할 때는 두 가지 부분. 필요한 정보 데이터. 이 데터를 사용자가 쉽게 분석할 수 있는 화면처리. 이 두 부분에서 도큐먼트 클래스는 필요한 정보 데이터를 파일에 저장하거나 로드하는 부분을 담당.
4
도큐먼트 클래스에서 파일 입출력. 그림1-7-1.파일 입출력 전체 구성도
5
Serialize() 함수(1) 파일을 저장하거나 오픈할 경우 최후에 데이터가 저장되는 부분은 Serialize함수에 의해서 설정. 도큐먼트 클래스의 Serialize 함수. void CExMyEdit2Doc::Serialize(CArchive& ar) { if (ar.IsStoring()) { //파일 저장부분 } else //파일 열기 부분 }
6
Serialize() 함수(2) Serialize함수는 인자로 CArchive 클래스의 변수인 ar 이 인자로 넘어옴.
도큐먼트 클래스에서 OnOpenDocument 함수가 수행되면 Serialize함수가 실행 . OnOpenDocument나 또는 OnSaveDocument 두 개의 함수내부에서는 CFile클래스를 이용하여 파일을 오픈. 파일을 오픈 한 다음 파일과 메모리간에 데이터 전송 통로를 만들어주는데 이 전송 통로가 바로 CArchive입니다.
7
Serialize() 함수(3) 예) Serialize에 “안녕하세요”라는 문자열을 입출력.
void CExMyEdit2Doc::Serialize(CArchive& ar) { CString data="안녕하세요“; if (ar.IsStoring()) { //파일 저장부분 ar << data; } else //파일 열기 부분 ar >> data; }
8
Serialize() 함수(4) CArchive 클래스의 맴버 함수인 IsStoring함수는 현재 저장 형태로 연결되었을 경우 TRUE를 리턴. 위의 예는 현재 저장형태 이면 data를 ar로 리다이렉션 시킨 것 입니다. ar << data;가 바로 이런 의미. 이렇게 되면 data의 값이 바로 ar로 들어가게 되고 ar자체는 하나의 파이프라는 개념이므로 이파이프를 통해서 파일로 전달되게 되는 것. 열기 형태로 연결되었을 경우 FALSE를 리턴. 만일 현재 오픈상태로 연결 되었을 경우에는 ar >> data; 함수를 이용하여 파이프와 연결된 파일에서 문자열을 얻어서 data라는 변수에 저장하게 되는 것
9
2. CEditView와 CRichEditView
뷰 클래스의 base 클래스를 CEditView로 한다. 메뉴에서 파일 입출력을 실행시키면 뷰 클래스의 전체 내용이 적용된다. 메뉴의 편집 기능이 활성화 된다. 메뉴의 프린트 기능이 활성화 된다. 뷰 클래스의 내용이 바뀌면 프로그램 종료시 저장 여부를 물어본다. Document type이 single 또는 multiple 모두에 적용된다. 뷰 클래스의 base 클래스를 CEditView
10
2. CEditView와 CRichEditView
뷰 클래스의 base 클래스를 CRichEditView로 한다. 뷰 클래스의 base 클래스를 CRichEditView
11
3. SDK 파일 입출력 SDK(Software Development Kit)
응용 프로그램의 개발을 간편하고 용이하게 하기 위해 프로그래머에게 유상이나 무상으로 제공되는 개발 도구. 프로그래머들이 솔루션 개발 시 자사의 응용 프로그램 인터페이스(API)를 채택하게 하기 위한 목적으로 대부분 무료로 제공된다. 개발 도구 및 라이브러리, 관련 도큐멘트, 개발 툴 등으로 구성.
12
파일 만들기와 열기 파일 만들기와 열기를 위해서 사용하는함수는 CreateFile. CreateFile의 기본형태.
HANDLE CreateFile( LPCTSTR lpFileName, // 파일명 문자열 포인터 DWORD dwDesiredAccess, // 읽기 쓰기 접근모드 DWORD dwShareMode, // 공유 모드 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 구조체 포인터 DWORD dwCreationDisposition, //파일 생성 플러그 DWORD dwFlagsAndAttributes, // 파일 속성 플러그 HANDLE hTemplateFile ); // 파일 속성을 복사할 핸들 포인터
13
CreateFile()의설명(1) lpFileName: 파일명
이곳에 파일명의 설명을 설정하면 해당 파일을 만들거나 오픈하고, 시스템 포트를 설정하면 해당 포트를 오픈. dwDesiredAccess: 읽기/쓰기 접근 모드. 이 모드값이 GENERIC_READ이면 읽기용이며, GENERIC_WRITE이면 쓰기용. 이 둘값을 OR연산으로 설정하면 읽기와 쓰기 모드가 동시에 가능. dwShareMode: 공유 모드값. 공유 모드란 현재 파일이 오픈 상태일 때 다른 유저들의 접근 허용을 설정하는 모드. 특정 파일을 오픈 하였을 때 이 파일이 다른 쪽에서 오픈 할 수 없도록 접근을 막는 경우. 이렇게 해야만 데이터를 정확하게 보존. FILE_SHARE_READ이면 읽기를 공유, FILE_SHARE_WRITE이면 쓰기를 공유.
14
CreateFile()의설명(2) lpSecurityAttributes: 보안에 대한 구조체 변수.
보통 Window NT에서 사용 권한자 모들를 설정하기 위한 구조체로서 윈도98에서는 NULL을 사용하여 이 부분을 무시합니다. dwCreationDisposition: 파일이 존재하는 것을 오픈할 것인지, 아니면 새로 만들 것인가에 대한 플러그. CreateFile의 dwCreationDisposition 인자에 값을 설정하여 오픈과 생성을 결정. 이 플러그값이 CREATE_NEW이면 새로 파일을 만든다는 의미. 이 플러그를 사용했을 때 현재 파일이 존재하면 새로 만들지 않고 에러를 리턴. 현재 존재하는 파일을 무시하고 파일을 만들고자 할 경우에는 CREATE_ALWAYS 플러그를 사용. 존재하는 파일을 오픈하고자 할 경우에는 dwCreationDisposition값에 OPEN_EXISTING 플러그를 사용.
15
CreateFile()의설명(3) dwFlagsAndAttributes: 그 밖의 파일 속성을 설정하는 플러그.
플 러 그 설 명 FILE_ATTRIBUTE_ARCHIVE 현재 파일이 archived 된다는 의미 이플러그를 설정하면 현재 파일이 이동되거나 사라졌을경우 이때의 상태를 마크한다. FILE_ATTRIBUTE_HIDDEN 감추어져 있는 형태 FILE_ATTRIBUTE_NORMAL 일반 파일 FILE_ATTRIBUTE_OFFLINE 현재 파일을 다른 곳에서 사용하기가 불가능한 상태로 설정 FILE_ATTRIBUTE_READONLY 읽기 전용파일 FILE_ATTRIBUTE_SYSTEM 시스템 파일
16
CreateFile()의설명(4) hTemplateFile: Windows 95에서는 사용하지 않고 NULL로 설정, NT에서는 읽기 전용으로 파일을 오픈하였을 때 오픈하고자 하는 핸들을 hTemplateFile에 설정. CreateFile을 이용하여 “test.dat”라는 파일을 오픈하고자 할 경우. HANDLE fd=CreateFile("test.dat",GENERIC_READ|GENERIC_WRITE, 0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 현재 존재하는 파일을 오픈하고자 할 경우. 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
17
파일에 읽고 쓰기 파일에서 데이터를 읽고자 할 경우에는 ReadFile 함수를 사용. ReadFile 함수의 기본형태
BOOL ReadFile( HANDLE hFile, // 파일 핸들 LPVOID lpBuffer, // 읽고자 하는 데이터를 저장 버퍼 포인터 DWORD nNumberOfBytesToRead, // 읽고자 하는 데이터의 길이 LPDWORD lpNumberOfBytesRead , // 읽혀진 데이터 길이 LPOVERLAPPED lpOverlapped // OVERLAPPED 구조체 포인터);
18
ReadFile()의 설명 hFile: 읽고자 하는 파일 핸들. lpBuffer: 읽은 데이터가 저장되는 버퍼.
CreateFile에 의해서 리턴된 핸들을 의미. lpBuffer: 읽은 데이터가 저장되는 버퍼. nNumberOfBytesToRead: 읽고자 하는 데이터 길이. nNumberOfBytesToRead값은 함수 사용시 설정하는 값. lpNumberOfBytesRead: 읽혀진 데이터의 길이. lpNumberOfBytesRead값은 함수가 실행된 후 리턴된 값. lpOverlapped: OVERLAPPED 구조체 포인터. 주로 파이프를 이용한 프로그램을 작성하거나 통신 포트에 데이터를 쓰고자 할 때 사용하는 구조체.
19
파일에 쓰기 파일에 데이터를 쓰고자 할 경우 WriteFile 함수를 사용. WriteFile 함수의 기본 형태.
BOOL WriteFile( HANDLE hFile, // 파일 핸들러 LPCVOID lpBuffer, // 쓰고자 하는 데이터가 설정된 버퍼 포인터 DWORD nNumberOfBytesToWrite, // 쓰고자 하는 데이터 길이 LPDWORD lpNumberOfBytesWritten,//쓰여진 데이터길이 LPOVERLAPPED lpOverlapped //OVERLAPPED 구조체 포인터);
20
WriteFile()의 설명 hFile: 쓰고자 하는 파일 핸들러. lpBuffer: 쓰고자 하는 데이터가 있는 버퍼 포인터.
nNumberOfBytesToWrite: 쓰고자 하는 데이터 길이. lpNumberOfBytesWritten: 파일에 기록하였을 때 실제 기록된 길이. lpOverlapped: OVERLAPPED 구조체 포인터.
21
파일 닫기 CloseHandle을 사용. CloseHandle()의 기본 형태. CloseHandle()의 설명.
BOOL CloseHandle( HANDLE hObject); CloseHandle()의 설명. hObject: CreateFile에 의해서 설정된 핸들값.
22
4. CFile 클래스 파일 열기와 만들기. 파일을 열거나 만들 경우 CFile 에서는 생성자나 Open 함수를 이용.
23
CFile를 이용한 파일 입출력 (1) 1.도큐먼트 클래스에 파일 정보를 저장할 메모리 포인터 변수를 선언한다. Class - CTestDoc - Insert member variables - HGLOBAL m_hMem CTestDoc::CTestDoc() { m_hMem = NULL; } 2.메모리에 공간을 확보한다. 3.도큐먼트 클래스의 OnOpenDocument()를 overriding한다. ClassWizard - CTestDoc - OnOpenDocument() 4.CFile 객체를 만든다. CFile file; 5.OnOpenDocument에서 입력된 파일 이름으로 파일을 연다. file.Open(lpszPathName,CFile::modeRead); 6.파일 크기를 알아낸다. DWORD dwFilesize=file.GetLength(); 7.파일 크기만큼 메모리를 확보한다. m_hMem = GlobalAlloc(GHND,dwFilesize); 8.확보된 메모리의 포인터를 고정시킨다. LPSTR lpText = (LPSTR)GlobalLock(m_hMem);
24
CFile를 이용한 파일 입출력 (2) 9.파일을 읽어 메모리에 채운다. 또는 메모리의 내용을 파일에 쓴다. file.ReadHuge(lpText,dwFilesize); file.WriteHuge(lpText,dwFilesize); 10.고정되었던 메모리를 이동할 수 있게 푼다. GlobalUnlock(m_hMem); 11.파일을 닫는다. file.Close(); 12.메모리의 내용을 사용하려면, 메모리를 고정시킨다. LPSTR lpText = (LPSTR)GlobalLock(pDoc->m_hMem); 13.할당된 메모리의 크기를 알아내려면, GlobalSize()를 사용한다. DWORD dwFilesize = GlobalSize(pDoc->m_hMem); 14.윈도우의 크기를 알아내려면, GetClientRect()를 사용한다. RECT rect; GetClientRect(&rect); 15.메모리의 내용을 CView에 문자들로 출력하려면, DrawText()를 사용한다. pDC->DrawText(lpText,dwFilesize,&rect,DT_EXPANDTABS); 16.메모리의 내용을 사용했으면, 메모리의 고정을 푼다. GlobalUnLock(pDoc->m_hMem); 17.프로그램이 종료되면 메모리를 해제한다. GlobalFree(pDoc->m_hMem);
Similar presentations