MFC 에서 CFile 클래스를 이용하여 텍스트를 파일에 기록하는 예
// 파일에 기록할 문자열
CString csText("안녕하세요?\r\n사랑합니다!\r\n축복합니다!\r\nThanks!\r\n");
// 문자열을 저장할 파일명
CString csFileName;
csFileName.Format(_T("%s\\CFile테스트.txt"), m_csSelectedDir); // m_csSelectedDir은 특정 폴더 경로
// 파일의 생성 및 열기
CFile file;
file.Open( csFileName, CFile::modeCreate|/*CFile::modeNoTruncate|*/CFile::modeWrite | CFile::typeText );
USES_CONVERSION;
char* str = W2A(csText); //기록할 문자열을 유니코드에서 MBCS 문자열로 변환
file.Write( str, strlen(str)); // 파일에 기록
file.Close();
파일모드를 CFile::modeCreate 으로 설정하면 기존 동일파일이 존재하더라도 새로 덮어쓰기 되어 파일 내용은 없어진 상태로 사용할 준비가 된다
아래처럼 파일모드를 조합할 경우, 동일이름으로 기존 파일이 존재하면 새로 생성하는 것이 아니라 기존 파일을 열고 사용할 준비가 된다.
CFile::modeCreate|CFile::modeNoTruncate
MFC 에서 FILE 구조체를 이용하여 텍스트를 파일에 기록하는 예
//문자열이 저장될 파일
CString m_errLogFile;
m_errLogFile.Format(_T("%s\\DateErrLog.txt"),m_csSelectedDir);
USES_CONVERSION;
char* chErrLogFile = W2A(m_errLogFile); //유니코드문자열로 구성된 파일명을 MBCS문자열로 변환
FILE* m_LOGFILE;
m_LOGFILE = fopen(chErrLogFile, "wt"); //파일열기, 없으면 생성됨
CString fname; // 파일에 저장할 문자열
fname.Format(_T("%s\n"),strFullPath); //strFullPath 는 CString형의 문자열
//USES_CONVERSION;
char* chFilePath = W2A(fname); //CString 객체 내의 유니코드문자열을 MBCS문자열로 변환
//파일에 문자열을 기록한다
fwrite( chFilePath,1, strlen(chFilePath), m_LOGFILE);
fclose(m_LOGFILE);
위와 같은 방법으로 파일에 텍스트를 저장하면 윈도우의 메모장이나 텍스트 에디터 등을 이용하여 파일을 열었을 때 한글이 제대로 입력되어 있는 것을 확인할 수 있다. 그런데 MFC에서 텍스트를 파일에 기록하면 유니코드 문자열을 기록하더라도 파일에 저장될 때는 MBCS 형태로 저장이 되기 때문에 다음과 같이 텍스트파일을 읽어서 출력할 때는 한글이 알아볼 수 없는 형태로 출력된다
CStdioFile stdioFile;
CFileException e;
CString csIdxFileName;
csIdxFileName.Format(_T("%s\\INDEX"), m_csSelectedDir);
if( !stdioFile.Open( csIdxFileName, CFile::modeRead | CFile::typeText, &e ) )
{
CString errMsg;
errMsg.Format(_T("INDEX파일 열기 실패:%d"),e.m_cause);
AfxMessageBox(errMsg);
return FALSE;
}
CString csLine;
//인덱스파일에서 한줄씩 읽어서 검색키워드가 포함된 문자열이면 vector에 저장한다
while(stdioFile.ReadString(csLine)) //텍스트 파일에서 한행을 읽어온다
{
csLine.Replace(_T("\r\n"),_T("")); //캐리지리턴 제거.
AfxMessageBox(csLine); // 여기서 출력되는 한글은 알아볼 수 없게 된다
위와같이 CStdioFile.ReadString() 을 이용하여 텍스트파일의 한행을 읽어서 출력할 때 한글이 깨지게 된다. 이것은 MFC에서 한글을 저장할 때 MBCS로 저장했기 때문인데 읽어올 때는 ReadString()함수가 유니코드로 읽어오기 때문이다. 이 묹제를 해결하는 가장 간단한 방법은 아마도 인터넷에 공개된 클래스를 사용하여 CStdioFile을 대치하면 쉽게 된다. CStdioFile 대신 CStdioFileEx 를 사용하면 된다.
CStdioFileEx 클래스를 이용하여 텍스트파일에 기록하고 읽어오는 방법은 다음과 같이 간단하게 처리된다
// CStdioFileEx 를 이용하여 텍스트파일에 쓰기
CStdioFileEx stdioFileEx;
stdioFileEx.Open( csFileName, CFile::modeWrite | CFile::typeText, &e ) )
{
CString errMsg;
errMsg.Format(_T("INDEX파일 열기 실패:%d"),e.m_cause);
AfxMessageBox(errMsg);
return FALSE;
}
CString csLine(_T("사랑합니다\r\n"));
stdioFileEx.WriteString(csLine);
stdioFileEx.Close();
// CStdioFileEx 를 이용하여 텍스트파일에서 읽어오기
stdioFileEx.Open( csFileName, CFile::modeRead | CFile::typeText, &e ) )
{
CString errMsg;
errMsg.Format(_T("INDEX파일 열기 실패:%d"),e.m_cause);
AfxMessageBox(errMsg);
return FALSE;
}
CString csRead;
stdioFileEx.ReadString(csRead);
AfxMessageBox(csRead); // 한글이 제대로 출력된다