txt文件读取和保存操作,该如何处理

txt文件读取和保存操作
RT
txt文档编码格式为UTF8,以前只做过ANSI的,谁有这方面的例子或者链接告诉我一下呗
谢谢

------解决方案--------------------
参考:
C/C++ code

// CEditStringDoc serialization
void CEditStringDoc::Serialize(CArchive& ar)
{
    BOOL    FirstLine=TRUE;
    WCHAR   wBuf[2048];
    char    szBuf[2048];
    int     i=0;
    BOOL    LineEnd=FALSE;
    char    type[10];
    char    dummy[10];
    char    *pLine=0;
    char    UniHead[4]={(char)0xEF,(char)0xBB,(char)0xBF,(char)0};
    char    UtfHead[3]={(char)0xFF,(char)0xFE,(char)0};
/*
EF BB BF    UTF-8  
FE FF     UTF-16/UCS-2, little endian  
FF FE     UTF-16/UCS-2, big endian  
FF FE 00 00  UTF-32/UCS-4, little endian.  
00 00 FE FF  UTF-32/UCS-4, big-endian.
*/
    CFile *pFile=ar.GetFile();
    CString name=pFile->GetFileTitle();//
    if((name.Find(".htm")==-1) && (name.Find(".txt")==-1))
    {    
        AfxMessageBox("Only suports *.htm or *.txt files!");
        return;
    }
//
    memset(type,0,10);
    memset(dummy,0,10);
//
    if (ar.IsStoring())
    {
        // TODO: add storing code here
        int all=m_TextArray.GetSize();
        for (int kk=0;kk<all;kk++)
        {
            strcpy(szBuf,m_TextArray[kk].GetBuffer(2048));
            strcat(szBuf,"\r\n");
            if(FirstLine)
            {
                if        (m_UTF8)    ar.Write(UniHead,3);
                else if (m_UNICODE)    ar.Write(UtfHead,2);
            }// end 1st line
            if(m_UTF8)
            {
                MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
                WideCharToMultiByte(CP_UTF8,0,wBuf,-1,szBuf,2048,0,0);
                ar.Write(szBuf,strlen(szBuf));            
            }
            if(m_UNICODE)
            {
                MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
                ar.Write(wBuf,2*wcslen(wBuf));            
            }
            else
            {
                ar.Write(szBuf,strlen(szBuf));            
            }
            FirstLine=FALSE;
        }// end for
    }// end save
    else
    {// if UTF8 file the 1st 3 chars are: EFh,BBh,BFh
     // if UNICODE file the 1st 2 chars are :FFh,FEh
     // TODO: add loading code here
        m_TextArray.RemoveAll();
        memset(szBuf,0,sizeof(szBuf));
        while(ar.Read(&szBuf[i],1))
        {//
            if(FirstLine)
            {
                if(    (szBuf[0]!=(char)0xEF) && 
                    (szBuf[0]!=(char)0xBB) &&
                    (szBuf[0]!=(char)0xBF) &&
                    (szBuf[0]!=(char)0xFF) &&
                    (szBuf[0]!=(char)0xFE) )
                {// normal file
                    m_UTF8=FALSE;
                    m_UNICODE=FALSE;
                    FirstLine=FALSE;
                    i++;
                    continue;
                }
                if(    szBuf[0]==(char)0xEF)
                {
                    type[0]=szBuf[0];
                    continue;
                }
                if(    szBuf[0]==(char)0xBB)
                {
                    type[1]=szBuf[0];    
                    continue;
                }
                if(    szBuf[0]==(char)0xBF)
                {
                    type[2]=szBuf[0];
                }
// Is UTF8 file ?
                if(    (type[0]==(char)0xEF) && 
                    (type[1]==(char)0xBB) &&    
                    (type[2]==(char)0xBF)  )
                {// UTF8 file
                    m_UTF8=TRUE;
                    m_UNICODE=FALSE;
                    FirstLine=FALSE;
                    continue;//i=0
                }
// Is UNICODE file ?
                if(    szBuf[0]==(char)0xFF)
                {
                    type[0]=szBuf[0]; 
                    continue;
                }
                if(    szBuf[0]==(char)0xFE)
                {
                    type[1]=szBuf[0];    
                }
                if(    (type[0]==(char)0xFF) && 
                    (type[1]==(char)0xFE) )    
                {
                    m_UNICODE=TRUE;
                    m_UTF8=FALSE;
                    FirstLine=FALSE;
                    continue;//i=0
                }
            }// end firstline
// check line end
            if(szBuf[i]==0x0D)
            {// 
                LineEnd=TRUE;
                szBuf[i]=0;
                ar.Read(dummy,1);//00 or 0a 
                if(m_UNICODE)
                {
                    szBuf[i+1]=0;
                    ar.Read(dummy,2);//0a 00
                }
            }
//
            if(LineEnd)
            {
                if(m_UTF8)
                {// utf8 file
                    MultiByteToWideChar(CP_UTF8,0,szBuf,-1,wBuf,2048);
                    WideCharToMultiByte(CP_ACP,0,wBuf,-1,szBuf,2048,0,0);
                    pLine=szBuf;            
                }
                else if(m_UNICODE)
                {// Unicode file
                    WideCharToMultiByte(CP_ACP,0,(WCHAR *)szBuf,-1,(char *)wBuf,2048,0,0);
                    pLine=(char *)wBuf;            
                }
                else
                {// normal file
                    pLine=szBuf;            
                }
                LineEnd=FALSE;// new line
                i=-1;// +1=0 szBuf[0]
//add 
                m_TextArray.Add(pLine);
                memset(szBuf,0,sizeof(szBuf));
            }// end LineEnd
            i++;//from 0
        }// end while
// if file end but no LF
        if(szBuf[0]!=0) m_TextArray.Add(szBuf);// last line  
        if(m_TextArray.GetSize()!=0)
        {
            UpdateAllViews(0);
        }
    }
}