728x90
반응형
MFC
의 CArchive
와 CString
을 함께 사용할 때, 파일에 문자열이 저장되는 방식에 대해 이해하는 것이 중요합니다.
일반적으로 CArchive
를 통해 CString
을 파일에 저장하면, 예상과 달리 문자열의 길이 정보가 함께 기록됩니다.
예를 들어, 다음과 같은 코드를 실행하여 파일에 "hello"라는 문자열을 저장한다고 가정해봅시다.
cpp
CFile file;
file.Open(_T("example.txt"), CFile::modeCreate | CFile::modeWrite);
CArchive archive(&file, CArchive::store);
CString str = _T("hello");
archive << str;
archive.Close();
file.Close();
이 경우, 파일에는 단순히 "hello"라는 5바이트의 문자열만 저장되는 것이 아니라, 첫 바이트에 문자열의 길이(5)가 기록되고 그 뒤에 "hello"가 저장되어 총 6바이트의 파일이 생성됩니다.
이러한 동작은 CArchive
의 <<
연산자 구현 방식에 기인합니다. 해당 연산자는 내부적으로 AfxWriteStringLength()
함수를 호출하여 문자열의 길이를 먼저 기록한 후, 실제 문자열 데이터를 저장합니다.
template< typename BaseType, class StringTraits >
CArchive& CArchive::operator<<(const ATL::CStringT<BaseType, StringTraits>& str)
{
AfxWriteStringLength(*this, str.GetLength(), sizeof(BaseType) == sizeof(wchar_t));
Write(str, str.GetLength()*sizeof(BaseType));
return *this;
}
이 함수는 문자열의 길이에 따라 기록 방식을 달리하며, 유니코드 환경에서는 추가적인 처리를 수행합니다.
void AFXAPI AfxWriteStringLength(CArchive& ar, UINT_PTR nLength, BOOL bUnicode)
{
if (bUnicode)
{
// Tag Unicode strings
ar<<(BYTE)0xff;
ar<<(WORD)0xfffe;
}
if (nLength < 255)
{
ar<<(BYTE)nLength;
}
else if (nLength < 0xfffe)
{
ar<<(BYTE)0xff;
ar<<(WORD)nLength;
}
else if (nLength < 0xffffffff)
{
ar<<(BYTE)0xff;
ar<<(WORD)0xffff;
ar<<(DWORD)nLength;
}
else
{
ar<<(BYTE)0xff;
ar<<(WORD)0xffff;
ar<<(DWORD)0xffffffff;
ar<<(ULONGLONG)nLength;
}
}
따라서, CArchive
와 CString
을 사용하여 파일 입출력을 수행할 때는 이러한 저장 방식을 이해하고 있어야 합니다.
이는 MFC뿐만 아니라 Delphi/C++ Builder의 VCL, Qt, Boost, ACE 등 다른 프레임워크나 라이브러리에서도 유사하게 적용될 수 있으므로, 내부 소스 코드를 확인하여 정확한 동작 방식을 파악하는 것이 좋습니다.
728x90
반응형
'C C++' 카테고리의 다른 글
C/C++ 역사 (0) | 2009.01.03 |
---|---|
Visual Studio 2005/2008 DLL 배포와 WinSxS의 활용법 (0) | 2008.12.05 |
[WIN32] 프로그램(프로세스) 한 번에 죽이는 예제 (0) | 2008.04.25 |
비트 이동 연산자 (Bit Shift Operator) (0) | 2008.03.28 |
C++ 구조체 멤버의 오프셋 얻기 (0) | 2007.10.12 |