[MFC] 일반 파일 입출력

단이·2022년 12월 13일
0

참고: [MFC]파일 입출력 , 학교 강의자료 7장

[MFC] 일반 파일 입출력

1. CFile 특징

  • 파일과 관련된 MFC의 최상위 클래스로 저수준의 파일 입출력 기능을 제공함
  • 일반 파일 입출력을 할 때 사용됨

📌 CFile 클래스 계층도

CFile구조

2. CFile 클래스의 기능

1) 파일을 열거나 생성(Open)
2) 파일을 닫음 (Close)
3) 데이터를 읽음 (Read)
4) 데이터를 씀 (Write)
5) 입출력 위치를 변경 (Seek)

📌 CFile을 이용해 파일 열고 생성하기 (Open)

  • 방법 1 ( 파일 생성 )
try{
    CFile file(_T(“mytest.txt”), CFile::modeReadWrite);
} //mytest.txt파일을 열고 modeReadWrite으로 모드 설정
catch (CFileException* e) {
    e -> ReportError();
    e -> Delete();
} //생성자는 리턴 값이 없으므로 예외 처리 기법을 사용하여 오류를 처리
  • 방법 2 ( 파일 열기 )
CFile file;
CFileException e;
if (!file.Open(_T(“mytest.txt”),CFile::modeReadWrite, &e))
    e.ReportError(); //리턴 값이 있으므로 일반 함수처럼 오류 처리
  • 파일 모드 설정 종류
    CFile모드종류

📌 CFile을 이용해 파일 닫기 (Close)

  • CFile을 로컬 변수로 선언하여 파일을 열면 객체 소멸 시 자동으로 파일을 닫으므로 파일을 닫는 함수를 명시적으로 호출할 필요가 없다.
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
CFile file;
CFileException e;
if (!file.Open(_T("mytest.txt"), CFile::modeReadWrite, &e)) {
e.ReportError();
return; } //로컬 변수로 선언
...
} // CFile::~CFile() 소멸자가 호출된다.
  • 명시적으로 닫을 수도 있다.
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
CFile file;
CFileException e;
if (!file.Open(_T("mytest1.txt"), CFile::modeReadWrite
|CFile::modeCreate|CFile::modeNoTruncate, &e)) { e.ReportError();
return;
}
... file.Close(); //지역 변수로 선언했을 때 명시적으로 선언하여 닫기
if (!file.Open(_T("mytest2.txt"), CFile::modeReadWrite |CFile::modeCreate|CFile::modeNoTruncate, &e)) { e.ReportError();
return;
}
... file.Close(); ...
} 

명시적으로 닫는 방법은 위처럼 CFile로 여러개의 파일을 다루게 될 때 유용하게 쓰인다.

📌 CFile 읽기와 쓰기 (Read & Write)

  • CFile을 이용해 파일을 읽고 쓰려면 CFile::Read(), CFile::Write() 함수를 사용하면 된다.
UINT CFile::Read(void* lpBuf, UINT nCount); //읽기
void CFile::Write(const void* lpBuf, UINT nCount); //쓰기
// lpBuf == 버퍼의 시작 주소, nCount == 전송할 바이트 수

📌 CFile 입출력 주소 바꾸기 (Seek)

  • CFile::Seek() 함수는 파일 포인터를 임의의 주소로 옮겨준다.
ULONGLONG CFile::Seek(LONGLONG lOff, UINT nFrom); //nFrom에서 lOff만큼 파일 포인터를 이동시킨다.
// lOff == 부호가 있는 정수 값(양수/0/음수)
  • nFrom은 파일 포인터 이동 시 기준점을 나타내는 값으로 CFile::begin, CFile::current, CFile::end 세 가지가 있다.

📌 다른 간단한 CFile 함수들

  • CFile::GetLength(), CFile::SetLength()
    파일의 현재 크기를 얻거나 변경
  • CFile::GetPosition()
    파일 포인터의 현재 위치를 얻음
  • CFile::LockRange(), CFile::UnlockRange()
    파일의 일정 영역을 잠그거나 해제. 잠근 영역은 다른 프로세스가 접근할 수 없음
  • CFile::GetFilePath(), CFile::GetFileName()
    파일의 전체 경로(Full Path)와 이름을 얻음

3. 그 밖의 유용한 클래스

📌 CMemFile

  • CMemFile 클래스를 이용하면 디스크가 아닌 메모리에 저장되는 파일을 생성할 수 있음.
void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { CMemFile file;
// 메모리 파일에 데이터 쓰기 int a = 100;
file.Write(&a, sizeof(a));
// 메모리 파일에서 데이터 읽기 file.SeekToBegin();
int b;
file.Read(&b, sizeof(b));
// 읽은 데이터 출력하기
TRACE(_T("b = %d\n"), b); }

임시로 사용하거나 파일을 빠르게 입출력할 때 유용하다. 파일을 여는 과정이 필요 없다.

📌 CStdioFile

  • 이 클래스는 텍스트를 줄 단위로 읽고 쓸 수 있는 CStdioFile::ReadString()CStdioFile::WriteString() 함수를 제공함.
void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { CStdioFile file1;
CFileException e;
if (!file1.Open(_T("test1.txt"), CFile::modeRead, &e)) {
e.ReportError();
return; }
CStdioFile file2;
if (!file2.Open(_T("test2.txt"), CFile::modeWrite | CFile::modeCreate, &e)) {
e.ReportError();
return; }
CString str;
while (file1.ReadString(str)) {
str.MakeUpper();
file2.WriteString(str + _T('\n')); }
}

해당 예제는 test1.txt을 모두 대문자로 바꿔 test2.txt에 저장하는 예제이다.

📌 CFileFind

  • 파일 검색 기능을 제공하는 클래스이다.
  • 계층도 (CFtpFileFind, CGopherFileFind 는 인터넷 서비스와 관련돼있어 다루지 않음.)
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
CFileFind finder;
BOOL bWorking = finder.FindFile(_T("*.*")); while (bWorking) {
bWorking = finder.FindNextFile(); if(finder.IsDirectory())
TRACE(_T("[%s]\n"), (LPCTSTR)finder.GetFileName());
else
TRACE(_T("%s\n"), (LPCTSTR)finder.GetFileName());
} }

현재 디렉터리에 있는 모든 파일과 디렉터리를 보여주는 예제이다.


0개의 댓글