1. 程式人生 > >UNICODE環境下讀寫txt檔案操作

UNICODE環境下讀寫txt檔案操作

自己動手整理了一下,寫了幾個函式,用於UNICODE環境下對txt文字檔案的操作,針對txt文字的ANSIC編碼格式,進行了字元編碼格式的轉換。
******************************************************************************
函  數  名  稱:BOOL FileWriteline(CString &filename,CStringW &msg)
函  數  功  能:向檔案filename末尾寫入一行指定的內容(CStringW)
函  數  參  數:filename為所要寫入的檔案,msg為所要寫入的內容
返    回    值:函式成功,返回TRUE,失敗返回FALSE
*******************************************************************************
BOOL FileWriteline(CString &filename,CStringW &msg)
{
    CStdioFile m_TextFile;
    if(!m_TextFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
        return FALSE;
    m_TextFile.SeekToEnd();   
    int ansiCount=WideCharToMultiByte(CP_ACP,0,msg,-1,NULL,0,NULL,NULL);
    char * pTempChar=(char*)malloc(ansiCount*sizeof(char));//申請空間
    memset(pTempChar,0,ansiCount);
    WideCharToMultiByte(CP_ACP,0,msg,-1,pTempChar,ansiCount,NULL,NULL);//轉換字元
    m_TextFile.Write(pTempChar,strlen(pTempChar));
    m_TextFile.Write("\n",1);
    free(pTempChar);
    m_TextFile.Close();
    return TRUE;
}

******************************************************************************
函  數  名  稱:CStringW FileReadline(CString &filename,int index)
函  數  功  能:從檔案filename中讀取指定行index的內容
函  數  參  數:filename為所要讀取的檔案,index為指定行數,從0開始
返    回    值:函式成功,返回讀取的一行內容(CStringW),檔案開啟失敗或檔案內容
                為空或是指定行數超過檔案內容本身的行數,返回內容為空,
*******************************************************************************
CStringW FileReadline(CString &filename,int index)
{
    CStringW  rt;
    int zline=file_nline(filename);
    if(index>zline-1)
    {
        rt=_T("");
        return rt;
    }
    CStdioFile m_TextFile;
    if(!m_TextFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead))
    {
        rt=_T("");
        return rt;
    }
    int nline=0;
    int i=0;
    char a[1];
    char *b;
    b = new char[500];   
    while(m_TextFile.Read(a,1) && zline!=0)
    {
        if(nline==index && a[0]!='\n')
        {
            b[i]=a[0];
            i++;
        }
        if(a[0]=='\n')
        {
            zline--;
            if(nline==index)
            {
                b[i]='\0';
                break;
            }
            else
                nline++;
        }
    }
    int  unicodeLen = MultiByteToWideChar( CP_ACP,0,b,-1,NULL,0 );
    wchar_t *  pUnicode;
    pUnicode = new  wchar_t[unicodeLen+1];
    memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
    MultiByteToWideChar( CP_ACP,0,b,-1,(LPWSTR)pUnicode,unicodeLen );
    rt = ( wchar_t* )pUnicode;
    m_TextFile.Close();
    delete  pUnicode;
    delete b;
    return rt;
}

******************************************************************************
函  數  名  稱:int file_nline(CString &filename)
函  數  功  能:獲取檔案filename內容的行數
函  數  參  數:filename為所要寫入的檔案,msg為所要寫入的內容
返    回    值:函式成功,返回filename的行數,失敗或檔案內容為空返回0
*******************************************************************************
int file_nline(CString &filename)
{
    char a[1];
    int nline=0;
    CStdioFile m_TextFile;
    if(!m_TextFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead))
    {
        return nline;
    }
    while(m_TextFile.Read(a,1)!=0)
    {
        if(a[0]=='\n')
            nline++;
    }
    m_TextFile.Close();
    return nline;
}

******************************************************************************
函  數  名  稱:BOOL FileModifyline(CString &filename,int index,CStringW &msg)
函  數  功  能:獲取檔案filename第index行的內容為msg
函  數  參  數:filename為要修改的檔案,index(從0開始)為行數,msg為要修改後的內容
返    回    值:函式成功,返回TRUE,失敗返回FALSE
*******************************************************************************
BOOL FileModifyline(CString &filename,int index,CStringW &msg)
{
    int k,nline;
    nline=file_nline(filename);
    if(index>nline-1)
        return FALSE;
    CStringW tempmsg;
    CString tempfile(_T("temp.txt"));
    for(k=0;k<nline;k++)
    {
        tempmsg=FileReadline(filename,k);
        if(tempmsg.IsEmpty())
            return FALSE;
        if(k==index)
        {
            if(FileWriteline(tempfile,msg)==FALSE)
                return FALSE;
        }
        else
        {
            if(FileWriteline(tempfile,tempmsg)==FALSE)
                return FALSE;
        }
    }
    CStdioFile modify;
    modify.Remove(filename);
    modify.Rename(tempfile,filename);
    return TRUE;
}