UNICODE環境下讀寫txt文件操做
(2011-07-26 17:40:05)
本身動手整理了一下,寫了幾個函數,用於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; }