UNICODE環境下讀寫txt文件操做

內容轉載自http://blog.sina.com.cn/s/blog_5d2bad130100t0x9.html

 

UNICODE環境下讀寫txt文件操做

  (2011-07-26 17:40:05)
標籤: 

雜談

分類: MFC程序設計
本身動手整理了一下,寫了幾個函數,用於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; }
相關文章
相關標籤/搜索