728x90
반응형
728x90
반응형
728x90
반응형

MFC CArchiveCString 사용 시 파일 저장 방식 이해

MFCCArchiveCString을 함께 사용할 때, 파일에 문자열이 저장되는 방식에 대해 이해하는 것이 중요합니다.

일반적으로 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;
    }
}

따라서, CArchiveCString을 사용하여 파일 입출력을 수행할 때는 이러한 저장 방식을 이해하고 있어야 합니다.

이는 MFC뿐만 아니라 Delphi/C++ Builder의 VCL, Qt, Boost, ACE 등 다른 프레임워크나 라이브러리에서도 유사하게 적용될 수 있으므로, 내부 소스 코드를 확인하여 정확한 동작 방식을 파악하는 것이 좋습니다.

728x90
반응형

+ Recent posts