참고: [MFC]파일 입출력 , 학교 강의자료 7장
1) 파일을 열거나 생성(Open)
2) 파일을 닫음 (Close)
3) 데이터를 읽음 (Read)
4) 데이터를 씀 (Write)
5) 입출력 위치를 변경 (Seek)
try{
CFile file(_T(“mytest.txt”), CFile::modeReadWrite);
} //mytest.txt파일을 열고 modeReadWrite으로 모드 설정
catch (CFileException* e) {
e -> ReportError();
e -> Delete();
} //생성자는 리턴 값이 없으므로 예외 처리 기법을 사용하여 오류를 처리
CFile file;
CFileException e;
if (!file.Open(_T(“mytest.txt”),CFile::modeReadWrite, &e))
e.ReportError(); //리턴 값이 있으므로 일반 함수처럼 오류 처리
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()
, CFile::Write()
함수를 사용하면 된다.UINT CFile::Read(void* lpBuf, UINT nCount); //읽기
void CFile::Write(const void* lpBuf, UINT nCount); //쓰기
// lpBuf == 버퍼의 시작 주소, nCount == 전송할 바이트 수
CFile::Seek()
함수는 파일 포인터를 임의의 주소로 옮겨준다.ULONGLONG CFile::Seek(LONGLONG lOff, UINT nFrom); //nFrom에서 lOff만큼 파일 포인터를 이동시킨다.
// lOff == 부호가 있는 정수 값(양수/0/음수)
CFile::begin
, CFile::current
, CFile::end
세 가지가 있다.CFile::GetLength()
, CFile::SetLength()
CFile::GetPosition()
CFile::LockRange()
, CFile::UnlockRange()
CFile::GetFilePath()
, CFile::GetFileName()
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::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에 저장하는 예제이다.
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());
} }
현재 디렉터리에 있는 모든 파일과 디렉터리를 보여주는 예제이다.