UNICODE環境下讀寫txt檔案操作
阿新 • • 發佈:2019-02-10
自己動手整理了一下,寫了幾個函式,用於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; }