컴퓨터 공부/MFC 프로그래밍

[5월 22일 3교시] Document 읽고 쓰기 1

려리군 2009. 5. 22. 13:26

CFile Class

물리적 파일과 연결되며 file을 대표하는 객체

Random Access

 - FP(File Pointer) : 현재 입출력이 일어날 위치

 - Read, Write연산을 통해 FP로부터 입출력 수행 후 이동.

함수

virtual BOOL CFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);

참고주소 : http://msdn.microsoft.com/en-us/library/hwbccf8z(vs.80).aspx

기본 CFile 생성자와 함게 사용되도록 만들어져 있다.

리턴 : 성공시 TRUE 실패시 FALSE. pError는 실패시에만 의미가 있다.

lpszFileName : 열고자 하는 파일 이름 문자열. 경로는 상대, 절대, 네트워크 이름이 가능하다.

nOpenFlags : 파일 접근모드

CFile::modeRead : 읽기전용, CFile::modeWrite : 쓰기전용, CFile::modeReadWrite : 읽기/쓰기, 

CFile::modeCreate : 파일이 없을 경우 생성.

pError : 실패 상태를 받을 파일 예외처리 객체의 포인터.


virtual void CFile::Write(const void* lpBuf, UINT nCount);

참고주소 : http://msdn.microsoft.com/en-us/library/esb6sz20(VS.80).aspx

CFile 객체와 관련된 파일로 버퍼 데이터를 쓴다.

lpBuf : 파일로 쓸 데이터를 포함하고 있는 사용자가 제공한 버퍼의 포인터

nCount : 버퍼로부터 전송될 바이트 수. 텍스트 모드 파일을 위해 CRLF도 1글자로 세어진다.


virtual UINT CFile::Read(void* lpBuf, UINT nCount);

참고주소 : http://msdn.microsoft.com/en-us/library/ctka0kks(VS.80).aspx

CFile 객체와 관련된 파일의 버퍼로 데이터를 읽는다.

lpBuf : 파일로 읽을 데이터를 받기 위한 사용자가 제공한 버퍼의 포인터

nCount : 파일로 부터 읽게 될 바이트 수의 최대 값.


virtual ULONGLONG CFile::Seek(LONGLONG lOff, UINT nFrom);

참고주소 : http://msdn.microsoft.com/en-us/library/8c5ccz0x(VS.80).aspx

이미 열린 파일에 대한 포인터를 재조정한다.

리턴 : 성공시 파일의 시작으로 부터의 offset 바이트 수 리턴. 실패시 CFileException발생

lOff : 포인터를 이동할 바이트 수

nForm : 포인터 이동 모드. 다음 값중 반드시 하나를 선택해야 한다.

 - CFile::begin : 파일의 시작으로부터 lOff 바이트 수만큼 이동

 - CFile::current : 파일의 현재 위치로부터 lOff 바이트 수만큼 이동

 - CFile::end : 파일의 끝에서 lOff바이트 수만큼 이동. lOff값은 음수여야 한다.


virtual ULONGLONG CFile::GetPosition( ) const;

참고주소 : http://msdn.microsoft.com/en-us/library/6b2hf282(VS.80).aspx

Seek의 다음 호출로 사용될 수 있는 파일 포인터의 현재 값을 얻는다.

리턴 : 파일 포인터


CArchive Class : 데이터를 binary로 저장.

CFile을 버퍼링

객체를 저장(출력)하고 불러오는(입력) 플래그를 가진다.

입출력을 위한 <<, >> 연산자 : 기본 데이터형이며 CObject에 대해 정의함.


virtual void CObject::Serialize(CArchive& ar);

참고주소 : http://msdn.microsoft.com/en-us/library/ct517hs4(VS.71).aspx

아카이브 객체로 현재 객체를 읽거나 쓴다.

Serialize(직렬화) : 프로그램이 만든 데이터를 Save/Load하는 작업

ar : 직렬화 하기 위한 CArchive객체.

if(ar.IsStoring()) // 저장을 위한 재정의

if(!ar.IsStoring()) // 불러오기를 위한 재정의


virtual void CDocument::DeleteContents();

참고주소 : http://msdn.microsoft.com/en-us/library/we24ktb3(VS.80).aspx

CDocument 객체 자체를 파괴하기 않고 document의 데이터를 지우기 위해 프레임 워크에 의해 호출된다.

호출되는 시점 : File/New명령, File/Open명령, Document 클래스가 파괴되기 전.


virtual void SetModifiedFlag(BOOL bModified = TRUE);

참고주소 : http://msdn.microsoft.com/en-us/library/570zcz2s(VS.80).aspx

document를 수정한 후 이 함수를 호출한다.

bModified : document가 수정되었음을 알리는 플래그


Serialize 가능한 클래스 만들기

 - CObject상속을 받는다.

 - 생성자 함수를 만들어 준다.

 - 헤더파일(h)에 DECLARE_SERIAL(클래스명) 매크로 추가

 - 구현파일(cpp)에 IMPLEMENT_SERIAL(클래스명, 부모클래스, 버젼번호) 매크로 추가