MFC WinCE 유니코드 환경에서 파일 생성, 읽기(CFile, CStdioFile)

MFC WinCE 유니코드 환경에서 파일 생성, 읽기(CFile, CStdioFile)


아래 작업은 Windows CE에서 진행되었습니다. 윈도우 임베디드 CE 6.0이란 책의 내용을 인용해 보면,


UTF16으로 프로그래밍하면 각 문자는 1바이트가 아니라 2바이트다.

즉, 문자열은 2배로 길어진다. 프로그래머는 버퍼 길이와 문자열 길이를 조심스럽게 취급해야 한다. WinCE에서는 'char' 데이터형 대신에 'TCHAR' 데이터형을 사용해야 한다


WinCE에선 UTF16으로 문자를 표현합니다. 무슨 말이냐면, 실제 유니코드 파일을 참고해 보면 압니다.


Windows CE는 UTF16 사용Windows CE는 UTF16 사용


흔히 사용하는 방법으론 위와 같이 문자 하나당 공백이 하나씩 들어오게 됩니다.


Windows CE는 UTF16 사용2[WinCE 유니코드] CFile, CStdioFIle

하지만, 유니코드 환경을 고려하지 않고 파일을 생성하게 되면 문자열 시작과 끝부분이 깨집니다. 실제 파일을 참조해 보면 위와 같이 원하지 않는 공백이 삽입되어 있습니다. 유니코드 환경을 적절히 반영하지 못한 결과입니다.


그래도 이런 문제점은 잡아내기 쉽습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
CFile InfoFile;
 
if(!InfoFile.Open(m_sPath, CFile::modeRead | CFile::typeBinary))
    InfoFile.Open(m_sPath, CFile::modeCreate | CFile::modeRead | CFile::typeBinary);
 
.....
.....
 
CString tmp;
tmp.Format(_T("%s,%s\n"), strTime, strName);
 
int nLen = tmp.GetLength();
InfoFile.Write(tmp, nLen * sizeof(TCHAR));
InfoFile.Close();
cs


CFile 객체를 선언하고 파일 내부에 쓰일 CString 변수를 초기화합니다.


파일 생성 시, 전체 길이에 TCHAR 자료형의 길이 만큼을 곱해줍니다.


1
2
3
4
5
6
7
8
9
10
11
CString sSearchfile = _T("");
 
CStdioFile InfoFile;
 
if(!InfoFile.Open(sPath, CFile::modeRead|CFile::typeBinary))
    InfoFile.Open(sPath, CFile::modeCreate | CFile::modeRead | CFile::typeBinary);
 
while(InfoFile.ReadString(sSearchfile))
{
    .... 
}
cs


파일을 읽어서 사용할 땐 위와 같이 ReadString을 이용할 수 있습니다.


mfc wince 파일 생성 읽기[WinCE 유니코드] CFile, CStdioFIle


ps. MFC - 표준 코딩안 중 _T 매크로 관련(아래 참조) [클릭]


WinCE, _T 매크로로 둘러싸기


프로젝트의 컴파일, 동작, 유니코드 빌드를 할 때, _T 매크로를 사용해 보세요. BCS에선 별 소용이 없지만, 유니코드 상에선 더없이 좋은 매크로입니다. strXXX의 _tcsXXX 함수보단 CString을 이용하는 게 좋고, char보단 TCHAR, const char보단 const CHAR을 이용하는 것도 좋습니다.


프로젝트를 빌드하다 보면 유니코드로 변환되는 경우도 있는데, 먼저 프로젝트 상의 속성을 Unicode로 변경해 놓으세요.


윈도우즈 NT, 2000, XP, Server 2003, 비스타를 포함해 이후에 출시되는 OS들도 유니코드를 기반으로 합니다. MBCS 기반의 응용 프로그램은 유니코드 기반의 프로그램보다 수행 속도가 느리기 때문이죠.


MSDN에서 _T 매크로에 대한 문서도 읽어보세요.


MFC WinCE 유니코드 환경에서 파일 생성, 읽기(CFile, CStdioFile)

이 글을 공유하기

댓글(0)

Designed by JB FACTORY