본문 바로가기
Study/MFC

MFC 파일 입출력

by 뿡뿡대마왕 2011. 9. 28.
반응형

출처: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

 

반응형

댓글