출처:http://www.cyworld.com/010_2585_6417/5688761
-MFC에서 파일 입출력 방법 2가지
㉠ 일반 파일 입출력
-CFile(파생) 클래스를 사용
-Read()나 Write()등의 함수를 이용 파일 입출력
-직렬화가 가진 한계 떄문에 일반 파일 입출력을 반드시 사용해야 하는 경우도 적지 않음.
-범용의 CFile 클래스를 우선적으로 다루는 것
-CFile 관련 클래스는 자체로도 파일 입출력 기능을 제공, 파생 클래스에게 공통의 인터페이스 제공.
㉡ 직렬화
-CArchive 클래스를 사용
-<< 또는 >> 연산자를 이용 파일 입출력
01-1. CFile 클래스
-MFC 파일 관련 클래스의 최상위 클래스, 저수준 파일 입출력 기능 제공
-핵심적 입출력 연산들
파일을 열거나 생성한다.(Open)
파일 포인터의 위치에서 데이터를 읽는다.(Read)
파일 포인터의 위치에 데이터를 쓴다.(Write)
파일포인터의 위치를 변경한다.(Seek)
파일을 닫는다.(Close)
※CFile 클래스와 파일 개념
-CFile의 자식 클래스들: 메모리(CMemFile), OLE(COleStreamFile), 로컬파일(CStdioFile), 인터넷(CInternetFile)
-운영체제와 C++의 다형성 덕택에 로컬파일이나 메모리, 통신, 인터넷이든 관계 없이 동일한 방식(API)로 처리한다. 파일을 다루는 방식을 로컬 파일 말고 장치에 사용해도 괜찮다.
-EX) COM1이나 COM2 같은 시리얼 포트 접근 방식
HANDLE hfile = ::CreateFile("\\\\.\\COM9, ...");
if (hFile != INVALID_HANDLE_VALUE)
{
CFile file(hfile);
...
}
㉠열기와 생성
-CFile 클래스의 생성자는 리턴 값이 없으므로 C++ 예외 처리 기법을 사용, 오류 처리.
try{
CFile file("mytest.txt", CFile::modeReadWrite);
}
catch (CFileException* e){
e->ReportError();
e->Delete();
}
-CFile::Open()함수를 이용하면 파일을 열거나 생성 가능, 리턴 값이 있으므로 일반 함수처럼 오류를 처리.
CFile file;
CFileException e;
if(!file.Open("mytest.txt", CFile::modeReadWrite, &e))
e.ReportError();
-CFile::CFile()과 CFile::Opne() 함수의 첫 번째 인자는 파일명이고, 두 번째 인자는 접근 및 공유 모드를
나타내는 플래그값
-의미의 충돌이 없으면 | 연산자 이용 여러개의 플래그 값 사용 가능.
-파일 접근과 공유모드에 따른 플래그들 모음
CFile::modeCreate 파일을 무조건 생성,같은 이름을 가진 파일이 있다면 크기를 0으로 바꾼다.
CFile::modeNoTruncate |연산자를 이용하여 CFile::modeCreate 플래그와 더불어 사용하면 같은 이름을 가진
파일이 있을 경우 크기를 0으로 바꾸지 않고 이 파일을 연다.
CFile::modeRead 읽기 전용 모드로 파일을 열거나 생성한다.
CFile::modeReadWrite 읽기와 쓰기 모드로 파일을 열거나 생성.
CFile::modeWrite 쓰기 전용 모드로 파일을 열거나 생성한다.
CFile::shareDenyNone 다른 프로세스에게 파일에 대한 읽기와 쓰기를 허용.
CFile::shareDenyRead 다른 프로세스에게 파일에 대한 읽기 금지
CFile::shareDenyWrite 다른 프로세스에게 파일에 대한 쓰기 금지
CFile::shareExclusive 다른 프로세스에게 파일에 대한 읽기와 쓰기를 금지.
㉡닫기
-CFile 객체를 사용할 겨우 객체가 소멸되면 자동으로 파일을 닫는다. 명시적으로 파일을 닫는 함수를 호출할
필요가 없다.
-void CExFileView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CFile file;
CFileException e;
if(!file.Open("mytest.txt", CFile::modeReadWrite | CFile::modeCreate, &e))
e.ReportError();
return;
}
//생략...
}//CFile::~CFile() 함수가 호출된다.
-CFile::Close()함수를 사용하면 명시적으로 파일을 닫을 수 있다.
-이방법은 하나의 CFile 객체를 이용하여 여러개의 파일을 다룰 때 유용하다.
void CExFileView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CFile file;
CFileException e;
if(!file.Open("mytest.txt", CFile::modeReadWrite | CFile::modeCreate | CFile::modeTruncate, &e)){
e.ReportError();
return;
}
//생략 ...
file.Close();
}
㉢읽기와 쓰기
-CFile::Read()와 CFile::Write() 함수는 파일 포인터 위치에서 데이터를 읽거나 쓰는 역할을 한다.
-두 함수의 원형은 UINT Cfile::Read (void* IpBuf, UINT nCount);
void CFile::Write(const void* IpBuf, UINT nCount);
-IpBuf는 버퍼의 주소값을 나타내며 nCount는 전송할 바이트수다.
-Read()함수의 리턴값은 버퍼로 전송된 실제 바이트수며 이 값은 nCount보다 작을 수도 있다.
㉢파일 포인터 위치 변경
-최대 크기는 2^64바이트이므로 파일 포인터의 위치는 64비트로 나타낸다.
-CFile::Seek()함수는 파일 포인터를 임의의 위치로 옮기는 역할을 한다.
-함수의 원형은 다음과 같다.
-ULONGLONG CFile::Seek(LONGLONG IOff, UINT nFrom);
-IOff는 부호있는 64비트 갑, 이 크기만큼 파일 포인터를 이동, IOff값은 경우에 따라서 음수가 된다.
-nFrom은 파일 포인터 이동시 기준점을 나타내는 값
-nFrom의 값
CFile::begin 파일의 처음 위치부터 IOff만큼 파일 포인터를 이동시킨다.
CFile::current 현재의 파일 포인터 위치부터 IOff만큼 파일 포인터를 이동
CFile::end 파일의 끝 위치부터 IOff만큼 파일 포인터를 이동.
-CFile::SeekToBegin() 또는 CFile::SeekToEnd() 함수를 이용하면 간단히 파일의 처음 또는 끝 위치로 파일
포인터를 이동.
-CFile::Seek() 함수의 리턴값은 부호없는 64비트 값으로 파일의 시작점을 기준으로 한 최종적인 파일
포인터의 위치를 나타낸다.
㉣기타함수(그밖의 유용한 CFile의 멤버함수)
-CFile::GetLength(), CFile::SetLength() 파일의 현재 크기를 얻거나 변경.
-CFile::GetPosition() 현재 파일 포인터 위치를 얻음.
-CFile::LockRange(), CFile::UnlockRange() 파일의 일정 영역을 잠그거나 해제, 잠근 영역은 다른
프로세스가 접근 불가.
-CFile::GetFilePath(), CFile::GetFileName() 파일의 전체 경로와 이름을 얻는다.
01-2.기타 클래스
㉠ CMemFile
-디스크가 아닌 메모리에 존재하는 파일 생성
-메모리의 일부 영역을 파일처럼 다루는 개념, 일시적으로 사용할 파일 등을 생성할 때 유용.
-CFile 클래스와 다르게 객체를 만들기만 하면 곧바로 사용, 그 밖의 입출력 함수는 CFile 클래스와 동일.
-void CExFileView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CMemFile file; // 객체 생성
int a = 100;
file.Write(&a, sizeof(a)); //메모리 파일에 쓰기
file.SeekToBegin(); //메모리 파일에서 읽기
int b;
file.Read(&b, sizeof(b));
TRACE("b = %d\n", b);
}
㉡CStidoFile
'Study > MFC' 카테고리의 다른 글
[MFC] 파일 드래그 앤 드롭 기능... (0) | 2011.09.28 |
---|---|
리스트 컨트롤에서 드래그 방지~ (0) | 2011.09.28 |
리스트 컨트롤에서 해당열을 클릭시 이벤트 처리 (0) | 2011.09.28 |
CString 문자열 조작 메소드~~~ 오홍오홍~~ (0) | 2011.09.28 |
파일 정보 얻기!!!!!!~~~~ (0) | 2011.09.28 |
댓글